为什么我无法将字符串(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;等等。
但为什么?
答案 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);
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;
更好的解决方案是弄清楚为什么数据首先被双重编码而不是那样做。