Javascript, як проаналізувати масив JSON


93

Я використовую 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, щоб я міг використовувати кожен з об'єктів лічильника.

Я намагаюся досягти цього так:

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

Що я роблю не так? Дякую!


Відповіді:


142

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);
}

Ось робочий приклад

РЕДАГУВАТИ : У вашому використанні циклу for є помилка (я пропустив це під час першого прочитання, кредит @Evert за це місце). використання циклу for-in встановить var як назву властивості поточного циклу, а не фактичних даних. Дивіться мій оновлений цикл вище для правильного використання

ВАЖЛИВО : JSON.parseметод не працюватиме у старих старих браузерах - тому, якщо ви плануєте зробити свій веб-сайт доступним через якийсь час, що згинає підключення до Інтернету, це може бути проблемою! Якщо вам справді цікаво, ось ось таблиця підтримки (яка ставить галочки на всіх моїх полях).


1
Якщо він використовує бібліотеку, яка підтримує функцію parseJSON між браузерами, він повинен використовувати це. Крім того, ви повторюєте помилку циклу.
Бергі,

Я отримую помилку в першому рядку, коли я запускаю це: Uncaught SyntaxError: Несподіваний маркер o
ночі

@nights: Це, швидше за все, у вас є недійсний рядок JSON, тоді спробуйте онлайн-інструмент перевірки JSON, як цей
musefan

8

Це моя відповідь,

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

У циклі for-in-loop запущена змінна містить ім'я властивості, а не значення властивості.

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

Але оскільки лічильник - це масив, ви повинні використовувати звичайний цикл for:

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

1

"Sencha way" для взаємодії з даними сервера - це налаштування Ext.data.Storeпроксі через Ext.data.proxy.Proxy(у даному випадку Ext.data.proxy.Ajax), забезпечене Ext.data.reader.Json(для даних, кодованих JSON, доступні також інші зчитувачі). Для запису даних на сервер існує Ext.data.writer.Writerдекілька типів.

Ось приклад такої установки:

    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, таких як сітки, списки або форми.



0

Це працює як шарм!

Тож я відредагував код відповідно до моїх вимог. І ось зміни: Це збереже номер ідентифікатора із відповіді у змінну середовища.

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

Відповідь з вищим голосом має помилку. коли я використовував його, я дізнався про це в рядку 3:

var counter = jsonData.counters[i];

Я змінив його на:

var counter = jsonData[i].counters;

і це спрацювало для мене. Існує відмінність від інших відповідей у ​​рядку 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
Можливо, ви маєте на увазі може там, де ви сказали, що має . Однак краще, якщо ви додасте більше деталей / пояснень до свого коду, це краще допоможе ОП та іншим людям, які мають таке саме запитання.
Тів,

Ви також можете трохи пояснити, чому обрали саме цей метод, щоб користувач дізнався трохи більше. Це допомогло б покращити цю відповідь.
TsTeaTime,

відповідь з найбільшою кількістю голосів відповіла на це запитання, але коли я використовую його, зрозумів, що він помилковий у рядку 4: var counter = jsonData.counters [i]; Але я змінюю його на: var counter = jsonData [i] .counters; і це спрацювало. тому я сказав, що замість слід.
Махді Джалалі,


-1

Вам слід використовувати сховище даних та проксі в ExtJs. Прикладів досить багато цього , і програма зчитування JSON автоматично аналізує повідомлення JSON у вказаній вами моделі.

Немає необхідності використовувати базовий Javascript при використанні ExtJs, все інакше, вам слід використовувати способи ExtJs, щоб все зробити правильно. Уважно прочитайте там документацію, це добре.

До речі, ці приклади також стосуються Sencha Touch (особливо v2), який базується на тих самих основних функціях, що і ExtJ.


-1

Не впевнений, що мої дані точно збігаються, але я мав масив масивів об’єктів 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()+"]")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.