繁体   English   中英

JSON.parse不会将字符串转换为对象

[英]JSON.parse don't convert a string to an object

为什么我不能将字符串(JSON格式)转换为对象?

这是js函数,它从服务器接收JSON格式的字符串:

function GetData(){
    xhr = new XMLHttpRequest;
    xhr.open('GET', 'http://'+ ip + ":" + port + "/api/s", true);

    xhr.onreadystatechange = function () {
        if (xhr.status == 200 && xhr.readyState == 4) { 

        try {
            var data = JSON.parse(xhr.responseText);
            for (var i=0; i<data['result'].length; i++) {
                ...some operations here...
                }
            }

        catch(e) {
            console.log(e.message + " in " + xhr.responseText);
            return}
        }
    }
    xhr.send();
}

但是我得到了字符串,JSON.parse无法正常工作:

Cannot read property 'length' of undefined in "{\"result\":[{\"id\":1, \"region\":\"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0410\u0434\u044b\u0433\u0435\u044f\"}, {\"id\":2, \"region\":\"\u0420\u0435\u0441\u043f\u0443\u0431\u043b\u0438\u043a\u0430 \u0411\u0430\u0448\u043a\u043e\u0440\u0442\u043e\u0441\u0442\u0430\u043d\"}, {\"id\":3, \"region\" ... and so on ...

我无法获取JSON对象属性值的长度,无法访问其属性“结果”,依此类推。

但为什么?

您期望xhr.responseText包含JSON编码的对象。 看起来它实际上包含JSON编码的字符串 (并且JSON编码的字符串包含JSON编码的对象)。 请注意, "周围的人物xhr.responseText当你console.log它。

这就是说:你有进行了编码作为然后被重新编码为JSON JSON对象。

当您运行JSON.parse(xhr.responseText) ,您将解码JSON编码的第一层。 这为您提供了代表对象的JSON字符串。

该字符串没有result属性。

您需要将第二组解码为JSON以获取对象:

var json = JSON.parse(xhr.responseText);
var data = JSON.parse(json);
console.log(data.result.length);

 console.log("Compare single encoded data:"); var json_obj = "{ \\"result\\": [] }"; console.log("JSON Object: " + json_obj); var obj = JSON.parse(json_obj); console.log("Object result length", obj.result.length); console.log("-------------"); console.log("With double encoded data:"); var json_str = "\\"{ \\\\\\"result\\\\\\": [] }\\""; console.log("JSON String (See the extra quotes?): " + json_str); var json_obj_2 = JSON.parse(json_str); console.log("JSON Object 2: " + json_obj_2); var obj_2 = JSON.parse(json_obj_2); console.log("Object 2 result length", obj.result.length); 


更好的解决方案是首先弄清楚为什么对数据进行双重编码,而不是这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM