Javascript come analizzare array JSON


92

Sto usando Sencha Touch (ExtJS) per ricevere un messaggio JSON dal server. Il messaggio che ricevo è questo:

{
"success": true,
"counters": [
    {
        "counter_name": "dsd",
        "counter_type": "sds",
        "counter_unit": "sds"
    },
    {
        "counter_name": "gdg",
        "counter_type": "dfd",
        "counter_unit": "ds"
    },
    {
        "counter_name": "sdsData",
        "counter_type": "sds",
        "counter_unit": "   dd       "
    },
    {
        "counter_name": "Stoc final",
        "counter_type": "number    ",
        "counter_unit": "litri     "
    },
    {
        "counter_name": "Consum GPL",
        "counter_type": "number    ",
        "counter_unit": "litri     "
    },
    {
        "counter_name": "sdg",
        "counter_type": "dfg",
        "counter_unit": "gfgd"
    },
    {
        "counter_name": "dfgd",
        "counter_type": "fgf",
        "counter_unit": "liggtggggri     "
    },
    {
        "counter_name": "fgd",
        "counter_type": "dfg",
        "counter_unit": "kwfgf       "
    },
    {
        "counter_name": "dfg",
        "counter_type": "dfg",
        "counter_unit": "dg"
    },
    {
        "counter_name": "gd",
        "counter_type": "dfg",
        "counter_unit": "dfg"
    }

    ]
}

Il mio problema è che non posso analizzare questo oggetto JSON in modo da poter utilizzare ciascuno degli oggetti contatore.

Sto cercando di ottenerlo in questo modo:

var jsonData = Ext.util.JSON.decode(myMessage);
for (var counter in jsonData.counters) {
     console.log(counter.counter_name);
 }

Che cosa sto facendo di sbagliato ? Grazie!


Risposte:


140

Javascript ha un'analisi JSON incorporata per le stringhe, che penso sia quello che hai:

var myObject = JSON.parse("my json string");

per usarlo con il tuo esempio sarebbe:

var jsonData = JSON.parse(myMessage);
for (var i = 0; i < jsonData.counters.length; i++) {
    var counter = jsonData.counters[i];
    console.log(counter.counter_name);
}

Ecco un esempio funzionante

EDIT : C'è un errore nel tuo utilizzo del ciclo for (mi sono perso questo alla mia prima lettura, credito a @Evert per lo spot). l'utilizzo di un ciclo for-in imposterà var come nome della proprietà del ciclo corrente, non i dati effettivi. Vedi il mio ciclo aggiornato sopra per un corretto utilizzo

IMPORTANTE : il JSON.parsemetodo non funzionerà nei vecchi vecchi browser, quindi se prevedi di rendere disponibile il tuo sito web attraverso una sorta di connessione Internet che piega il tempo, questo potrebbe essere un problema! Se davvero sei interessato però, ecco una tabella di supporto (che spunta tutte le mie caselle).


1
Se usa una libreria che supporta una funzione parseJSON cross-browser, dovrebbe usarla. Inoltre, ripeti l'errore del ciclo.
Bergi

Ottengo un errore sulla prima riga quando eseguo questo: Uncaught SyntaxError: Unexpected token o
nights

@nights: è molto probabile che tu abbia una stringa JSON non valida, quindi prova uno strumento di convalida JSON online, come questo
musefan

8

Questa è la mia risposta

<!DOCTYPE html>
<html>
<body>
<h2>Create Object from JSON String</h2>
<p>
First Name: <span id="fname"></span><br> 
Last Name: <span id="lname"></span><br> 
</p> 
<script>
var txt = '{"employees":[' +
'{"firstName":"John","lastName":"Doe" },' +
'{"firstName":"Anna","lastName":"Smith" },' +
'{"firstName":"Peter","lastName":"Jones" }]}';

//var jsonData = eval ("(" + txt + ")");
var jsonData = JSON.parse(txt);
for (var i = 0; i < jsonData.employees.length; i++) {
    var counter = jsonData.employees[i];
    //console.log(counter.counter_name);
    alert(counter.firstName);
}

</script>
</body>
</html>

6

In un ciclo for-in-loop, la variabile in esecuzione contiene il nome della proprietà, non il valore della proprietà.

for (var counter in jsonData.counters) {
    console.log(jsonData.counters[counter].counter_name);
}

Ma poiché i contatori sono un array, devi usare un normale ciclo for:

for (var i=0; i<jsonData.counters.length; i++) {
    var counter = jsonData.counters[i];
    console.log(counter.counter_name);
}

1

Il "modo Sencha" per interagire con i dati del server consiste nel configurare un Ext.data.Storeproxy Ext.data.proxy.Proxy(in questo caso Ext.data.proxy.Ajax) fornito con un Ext.data.reader.Json(per i dati codificati JSON, sono disponibili anche altri lettori). Per riscrivere i dati sul server ce ne sono Ext.data.writer.Writerdi diversi tipi.

Ecco un esempio di una configurazione come questa:

    var store = Ext.create('Ext.data.Store', {
        fields: [
            'counter_name',
            'counter_type',
            'counter_unit'
        ],

        proxy: {
            type: 'ajax',
            url: 'data1.json',

            reader: {
                type: 'json',
                idProperty: 'counter_name',
                rootProperty: 'counters'
            }
        }
    });

data1.jsonin questo esempio (disponibile anche in questo violino ) contiene i tuoi dati alla lettera. idProperty: 'counter_name'è probabilmente opzionale in questo caso, ma di solito punta all'attributo della chiave primaria. rootProperty: 'counters'specifica quale proprietà contiene un array di elementi di dati.

Con una configurazione del negozio in questo modo è possibile rileggere i dati dal server chiamando store.load(). Puoi anche collegare il negozio a qualsiasi componente dell'interfaccia utente appropriato di Sencha Touch come griglie, elenchi o moduli.



0

Funziona a meraviglia!

Quindi ho modificato il codice secondo le mie esigenze. Ed ecco le modifiche: salverà il numero id dalla risposta nella variabile d'ambiente.

var jsonData = JSON.parse(responseBody);
for (var i = 0; i < jsonData.data.length; i++)
{
    var counter = jsonData.data[i];
    postman.setEnvironmentVariable("schID", counter.id);
}

0

La risposta con il voto più alto ha un errore. quando l'ho usato lo scopro nella riga 3:

var counter = jsonData.counters[i];

L'ho cambiato in:

var counter = jsonData[i].counters;

e ha funzionato per me. C'è una differenza rispetto alle altre risposte nella riga 3:

var jsonData = JSON.parse(myMessage);
for (var i = 0; i < jsonData.counters.length; i++) {
    var counter = jsonData[i].counters;
    console.log(counter.counter_name);
}

1
Forse vuoi dire può dove hai detto dovrebbe . Tuttavia è meglio se aggiungi più dettagli / spiegazioni al tuo codice, questo aiuterà meglio OP e altre persone che hanno la stessa domanda.
Tiw

Puoi anche spiegare un po 'il motivo per cui hai scelto questo metodo in modo che l'utente impari un po' di più. Ciò contribuirebbe a migliorare questa risposta.
TsTeaTime

la risposta con il maggior numero di voti ha risposto a questa domanda ma quando la uso ho capito che è sbagliato nella riga 4: var counter = jsonData.counters [i]; Ma lo cambio in: var counter = jsonData [i] .counters; e ha funzionato. così ho detto può invece di dovrebbe.
Mahdi Jalali

0

Proprio come un avvertimento ...

var data = JSON.parse(responseBody);

è stato deprecato .

Postman Learning Center ora suggerisce

var jsonData = pm.response.json();

-1

Dovresti usare un datastore e un proxy in ExtJs. Ci sono molti esempi di questo e il lettore JSON analizza automaticamente il messaggio JSON nel modello specificato.

Non è necessario utilizzare Javascript di base quando si utilizza ExtJs, tutto è diverso, dovresti usare i modi ExtJs per ottenere tutto bene. Leggi attentamente la documentazione, va bene.

A proposito, questi esempi valgono anche per Sencha Touch (specialmente v2), che si basa sulle stesse funzioni di base di ExtJs.


-1

Non sono sicuro che i miei dati corrispondano esattamente, ma avevo una serie di array di oggetti JSON, che venivano esportati da jQuery FormBuilder quando si utilizzavano le pagine.

Spero che la mia risposta possa aiutare chiunque si imbatta in questa domanda alla ricerca di una risposta a un problema simile a quello che ho avuto.

I dati erano in qualche modo così:

var allData = 
[
    [
        {
            "type":"text",
            "label":"Text Field"
        }, 
        {
            "type":"text",
            "label":"Text Field"
        }
    ],
    [
        {
            "type":"text",
            "label":"Text Field"
        }, 
        {
            "type":"text",
            "label":"Text Field"
        }
    ]
]

Quello che ho fatto per analizzare questo è stato semplicemente fare quanto segue:

JSON.parse("["+allData.toString()+"]")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.