JavaScript, jak analizować tablicę JSON

93

Używam Sencha Touch (ExtJS), aby uzyskać wiadomość JSON z serwera. Otrzymuję taką wiadomość:

{
"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"
    }

    ]
}

Mój problem polega na tym, że nie mogę przeanalizować tego obiektu JSON, aby móc użyć każdego z obiektów licznika.

Próbuję to osiągnąć w ten sposób:

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

Co ja robię źle ? Dziękuję Ci!

maephisto
źródło

Odpowiedzi:

142

Javascript ma wbudowaną analizę JSON dla ciągów, które myślę, że masz:

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

aby użyć tego w przykładzie, to:

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

Oto działający przykład

EDYCJA : Wystąpił błąd w używaniu pętli for (przegapiłem to przy pierwszym czytaniu, uznanie dla @Evert za spot). użycie pętli for-in ustawi zmienną jako nazwę właściwości bieżącej pętli, a nie rzeczywiste dane. Zobacz moją zaktualizowaną pętlę powyżej, aby uzyskać prawidłowe użycie

WAŻNE : ta JSON.parsemetoda nie zadziała w starych, starych przeglądarkach - więc jeśli planujesz udostępnić swoją witrynę za pomocą jakiegoś zaginającego czas połączenia internetowego, może to być problem! Jeśli jednak naprawdę jesteś zainteresowany, oto wykres wsparcia (który zaznacza wszystkie moje pola).

musefan
źródło
1
Jeśli używa biblioteki obsługującej funkcję parseJSON w różnych przeglądarkach, powinien jej użyć. Powtarzasz również błąd pętli.
Bergi
W pierwszym wierszu pojawia się błąd, gdy uruchamiam to: Uncaught SyntaxError: Nieoczekiwany token o
noce
@nights: Najprawdopodobniej masz nieprawidłowy ciąg JSON, wypróbuj internetowe narzędzie do weryfikacji JSON, takie jak to
musefan
8

To jest moja odpowiedź

<!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>
Fisher Man
źródło
6

W pętli for-in-loop działająca zmienna przechowuje nazwę właściwości, a nie wartość właściwości.

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

Ale ponieważ counters jest tablicą, musisz użyć zwykłej pętli for:

for (var i=0; i<jsonData.counters.length; i++) {
    var counter = jsonData.counters[i];
    console.log(counter.counter_name);
}
Bergi
źródło
1

„Sposób Sencha” do interakcji z danymi serwera polega na skonfigurowaniu serwera Ext.data.Storeproxy Ext.data.proxy.Proxy(w tym przypadku Ext.data.proxy.Ajax) wyposażonego w (w przypadku Ext.data.reader.Jsondanych zakodowanych w formacie JSON dostępne są również inne czytniki). Istnieje Ext.data.writer.Writerkilka rodzajów zapisywania danych z powrotem na serwer .

Oto przykład takiej konfiguracji:

    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.jsonw tym przykładzie (również dostępny w tym skrzypcach ) zawiera dane dosłownie. idProperty: 'counter_name'jest prawdopodobnie opcjonalny w tym przypadku, ale zwykle wskazuje na atrybut klucza podstawowego. rootProperty: 'counters'określa, która właściwość zawiera tablicę elementów danych.

Dzięki konfiguracji sklepu w ten sposób możesz ponownie odczytać dane z serwera, dzwoniąc store.load(). Możesz także połączyć sklep z dowolnymi komponentami interfejsu użytkownika Sencha Touch, takimi jak siatki, listy lub formularze.

rzen
źródło
0

To działa jak urok!

Więc zredagowałem kod zgodnie z moimi wymaganiami. A oto zmiany: zapisze numer identyfikacyjny z odpowiedzi do zmiennej środowiskowej.

var jsonData = JSON.parse(responseBody);
for (var i = 0; i < jsonData.data.length; i++)
{
    var counter = jsonData.data[i];
    postman.setEnvironmentVariable("schID", counter.id);
}
Sobhit Sharma
źródło
0

Odpowiedź z wyższą liczbą głosów zawiera błąd. kiedy go użyłem, dowiedziałem się o tym w linii 3:

var counter = jsonData.counters[i];

Zmieniłem to na:

var counter = jsonData[i].counters;

i to zadziałało dla mnie. Istnieje różnica w stosunku do innych odpowiedzi w wierszu 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);
}
Mahdi Jalali
źródło
1
Może masz na myśli puszkę gdzie mówiłeś powinien . Jednak lepiej, jeśli dodasz więcej szczegółów / wyjaśnień do swojego kodu, to lepiej pomoże OP i innym osobom, które mają to samo pytanie.
Tiw
Możesz też trochę wyjaśnić, dlaczego wybrałeś tę metodę, aby użytkownik nauczył się nieco więcej. To pomogłoby ulepszyć tę odpowiedź.
TsTeaTime
odpowiedź z największą liczbą głosów odpowiedziała na to pytanie, ale kiedy jej użyłem, zrozumiałem, że jest błędna w linii 4: var counter = jsonData.counters [i]; Ale zmieniam to na: var counter = jsonData [i] .counters; i zadziałało. więc powiedziałem może zamiast powinien.
Mahdi Jalali
0

Tak jak heads-up ...

var data = JSON.parse(responseBody);

został wycofany .

Postman Learning Center proponuje teraz

var jsonData = pm.response.json();
Rysował
źródło
-1

W ExtJs należy używać magazynu danych i serwera proxy. Istnieje wiele takich przykładów , a czytnik JSON automatycznie analizuje wiadomość JSON do określonego modelu.

Nie ma potrzeby używania podstawowego JavaScript podczas korzystania z ExtJs, wszystko jest inne, powinieneś użyć sposobów ExtJ, aby wszystko było dobrze. Przeczytaj uważnie dokumentację, jest dobra.

Nawiasem mówiąc, te przykłady dotyczą również Sencha Touch (zwłaszcza v2), który jest oparty na tych samych podstawowych funkcjach co ExtJs.

Geerten
źródło
-1

Nie jestem pewien, czy moje dane są dokładnie dopasowane, ale miałem tablicę tablic obiektów JSON, które zostały wyeksportowane z jQuery FormBuilder podczas korzystania ze stron.

Mam nadzieję, że moja odpowiedź może pomóc każdemu, kto natknie się na to pytanie, szukając odpowiedzi na problem podobny do tego, który miałem.

Dane wyglądały mniej więcej tak:

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

Aby przeanalizować to, po prostu wykonałem następujące czynności:

JSON.parse("["+allData.toString()+"]")
James Wolfe
źródło