Javascript как разобрать массив JSON



Я использую Sencha Touch (ExtJS), чтобы получить сообщение JSON с сервера. Я получаю следующее сообщение:



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

]
}


моя проблема заключается в том, что я не могу разобрать этот объект JSON, чтобы я мог использовать каждый из объектов счетчика.



Я пытаюсь acomplish вот так:



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


что я делаю не так ?
Спасибо!

574   8  

8 ответов:

Javascript имеет встроенный синтаксический анализ JSON для строк, который, я думаю, у вас есть:

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

чтобы использовать это с вашим примером будет:

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

вот рабочий пример

EDIT: есть ошибка в использовании for loop (я пропустил это при первом чтении, кредит @Evert для этого места). использование цикла for-in установит var в качестве имени свойства текущего цикла, а не фактических данных. См. Мой обновленный цикл выше для правильного использования

важно: the JSON.parse метод не будет работать в старых старых браузерах-так что если вы планируете сделать ваш сайт доступным через какое-то время изгиб подключения к интернету, это может быть проблемой! Если вы действительно заинтересованы, хотя,вот диаграмма поддержки (который помечает все мои коробки).

в цикле for-in работающая переменная содержит имя свойства, а не значение свойства.

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

но поскольку счетчики-это массив, вы должны использовать обычный for-loop:

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

Это мой ответ,

<!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>

"Sencha way" для взаимодействия с данными сервера настраивает Ext.data.Store оценена в Ext.data.proxy.Proxy (в данном случае Ext.data.proxy.Ajax) оформленные с Ext.data.reader.Json (для JSON-кодированных данных есть и другие доступные читатели). Для записи данных обратно на сервер есть Ext.data.writer.Writer s нескольких видов.

вот пример такой установки:

    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 в этом примере (также доступно в эта скрипка) содержит сведения дословно. idProperty: 'counter_name' вероятно, в этом случае необязательно, но обычно указывает на атрибут первичного ключа. rootProperty: 'counters' указывает, какое свойство содержит массив элементов данных.

С помощью настройки хранилища таким образом вы можете перечитывать данные с сервера, вызывая store.load(). Вы также можете подключить магазин к любым компонентам пользовательского интерфейса Sencha Touch, таким как сетки, списки или формы.

что-то более важное для меня..

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

ссылка: https://docs.microsoft.com/en-us/scripting/javascript/reference/json-parse-function-javascript

это работает как шарм!

поэтому я отредактировал код в соответствии с моим требованием. А вот и изменения: Он сохранит идентификационный номер из ответа в переменную среды.

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

вы должны использовать хранилище данных и прокси в ExtJs. Есть много примеры этого, и читатель JSON автоматически анализирует сообщение JSON в указанную вами модель.

нет необходимости использовать базовый Javascript при использовании ExtJs, все по-другому, вы должны использовать ExtJs способы, чтобы получить все правильно. Внимательно прочитайте там документацию, это хорошо.

кстати, эти примеры также относятся к Sencha Touch (особенно v2), который является на основе тех же основных функций, что и ExtJs.

Не уверен, что мои данные точно совпадают, но у меня был массив массивов объектов JSON, которые были экспортированы из jQuery FormBuilder при использовании страниц.

Надеюсь, мой ответ может помочь любому, кто натыкается на этот вопрос, ища ответ на проблему, похожую на то, что у меня было.

данные выглядели примерно так:

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

что я сделал, чтобы разобрать это было просто сделать следующее:

JSON.parse("["+allData.toString()+"]")

Comments

    Ничего не найдено.