Javascript如何解析JSON数组

mae*_*sto 80 javascript json extjs

我正在使用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"
    }

    ]
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我无法解析这个JSON对象,以便我可以使用每个计数器对象.

我试图这样做:

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

我究竟做错了什么 ?谢谢!

mus*_*fan 129

Javascript有一个内置的字符串JSON解析,我认为你有:

var myObject = JSON.parse("my json string");
Run Code Online (Sandbox Code Playgroud)

在你的例子中使用它将是:

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

这是一个有效的例子

编辑:你使用for循环有一个错误(我在第一次阅读时错过了这个,因为当场的@Evert归功于此).使用for-in循环将var设置为当前循环的属性名称,而不是实际数据.有关正确用法,请参阅上面的更新循环

重要提示:该JSON.parse方法不适用于旧的旧浏览器 - 因此,如果您计划通过某种时间弯曲互联网连接使您的网站可用,这可能是一个问题!如果你真的感兴趣,这里是一个支持图表(勾选我的所有方框).


Ber*_*rgi 6

在for-in-循环中,运行变量包含属性名称,而不是属性值.

for (var counter in jsonData.counters) {
    console.log(jsonData.counters[counter].counter_name);
}
Run Code Online (Sandbox Code Playgroud)

但由于计数器是一个数组,你必须使用正常的for循环:

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


Fis*_*Man 5

这是我的答案

<!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>
Run Code Online (Sandbox Code Playgroud)