Javascript how to parse JSON array

I'm using Sencha Touch (ExtJS) to get a JSON message from the server. The message I receive is this one :

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


]
}

My problem is that I can't parse this JSON object so that i can use each of the counter objects.

I'm trying to acomplish that like this :

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

What am i doing wrong ? Thank you!

609213 次浏览

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方法在旧的浏览器中不起作用-所以如果你打算通过某种时间弯曲的互联网连接使你的网站可用,这可能是一个问题!如果你真的感兴趣,尽管,here is a support chart(这符合我所有的方框)。

在 for-In-loop 中,运行变量保存的是属性名,而不是属性值。

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

但由于计数器是 Array,因此必须使用普通的 for 循环:

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

You should use a datastore and proxy in ExtJs. There are plenty of 例子 of this, and the JSON reader automatically parses the JSON message into the model you specified.

在使用 ExtJs 时没有必要使用基本的 Javascript,一切都是不同的,你应该使用 ExtJs 的方式来使一切正确。仔细阅读那里的文档,很好。

顺便说一下,这些例子也适用于 Sencha Touch (特别是 v2) ,它基于与 ExtJs 相同的核心功能。

我的回答是:

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

对我来说更重要的是。

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://learn.microsoft.com/en-us/scripting/javascript/reference/json-parse-function-javascript

与服务器数据交互的“ Sencha 方式”是设置一个由 Ext.data.proxy.Proxy(在本例中为 Ext.data.proxy.Ajax)代理的 Ext.data.Store,并提供 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(也可以在 this fiddle中找到)包含您的数据。在这种情况下,idProperty: 'counter_name'可能是可选的,但通常指向主键属性。rootProperty: 'counters'指定哪个属性包含数据项数组。

通过这种存储设置,您可以通过调用 store.load()从服务器重新读取数据。您还可以将存储连接到任何适当的 Sencha Touch UI 组件,如网格、列表或表单。

不确定我的数据是否完全匹配,但是我有一个 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"
}
]
]

What I did to parse this was to simply do the following:

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

这招太有魅力了!

So I edited the code as per my requirement. And here are the changes: 它会把 id 号码从响应中保存到环境变量中。

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

得票较高的答案是错误的。当我使用它时,我在第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);
}

提醒你一下。

var data = JSON.parse(responseBody);

不赞成

Postman Learning Center 现在 suggests

var jsonData = pm.response.json();