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!
javascript
json
extjs
maephisto
źródło
źródło
Odpowiedzi:
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.parse
metoda 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).źródło
To jest moja odpowiedź
źródło
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); }
źródło
„Sposób Sencha” do interakcji z danymi serwera polega na skonfigurowaniu serwera
Ext.data.Store
proxyExt.data.proxy.Proxy
(w tym przypadkuExt.data.proxy.Ajax
) wyposażonego w (w przypadkuExt.data.reader.Json
danych zakodowanych w formacie JSON dostępne są również inne czytniki). IstniejeExt.data.writer.Writer
kilka 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.json
w 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.źródło
Coś bardziej trafnego dla mnie ...
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}'; var contact = JSON.parse(jsontext); document.write(contact.surname + ", " + contact.firstname); document.write(contact.phone[1]); // Output: // Aaberg, Jesper // 555-0100
źródło
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); }
źródło
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); }
źródło
Tak jak heads-up ...
var data = JSON.parse(responseBody);
został wycofany .
Postman Learning Center proponuje teraz
var jsonData = pm.response.json();
źródło
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.
źródło
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()+"]")
źródło