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

时间:2017-07-27 10:16:33

标签: javascript json

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

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

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-object属性值的长度,无法访问它的属性&#39;结果&#39;等等。

但为什么?

1 个答案:

答案 0 :(得分:1)

您希望xhr.responseText包含JSON编码对象。看起来它实际上包含一个JSON编码的字符串(并且JSON编码的字符串包含一个JSON编码的对象)。当" {/ 1}}时,请注意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);

&#13;
&#13;
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);
&#13;
&#13;
&#13;

更好的解决方案是弄清楚为什么数据首先被双重编码而不是那样做。