[英]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.