簡體   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