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);
}
Что я делаю неправильно?
Спасибо!
Ответы
Ответ 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, таким как сетки, списки или формы.
Ответ 5
Что-то большее для меня..
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
Ответ 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);
}