Подтвердить что ты не робот

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-объект, чтобы я мог использовать каждый из объектов-счетчиков.

Я пытаюсь понять, что вот так:

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

Что я делаю неправильно? Спасибо!

4b9b3361

Ответ 1

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 не будет работать в старых старых браузерах, поэтому, если вы планируете сделать свой сайт доступным через какое-то время, изгибая интернет-соединение, это может быть проблемой! Если вы действительно заинтересованы, вот график поддержки (который галочки всех моих ящиков).

Ответ 2

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

Ответ 3

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

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

Ответ 4

"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, таким как сетки, списки или формы.

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

Не уверен, что мои данные совпадают точно, но у меня был массив массивов объектов 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()+"]")

Ответ 9

Ответ с более высоким голосом имеет ошибку. когда я это использовал, я узнал об этом в строке 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);
}