2017-07-27 31 views
0

爲什麼我不能將字符串(JSON格式)轉換爲對象?JSON.parse不要將字符串轉換爲對象

這是從服務器接收到一個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屬性值,不能訪問它的屬性'result'等等。

但是爲什麼?

+0

'data ['result']'是未定義的,但假設'data'中有一個result屬性。你是否檢查過'xhr.responseText'和'data'本身的值來判斷這個結構是否可能與你預期的稍有不同? – GolezTrol

+0

你的JSON有問題。使用在線JSON檢查器檢查JSON:https://jsonlint.com/ – Bee157

+0

在JSON.parse行後面查看輸出 –

回答

1

您期望xhr.responseText包含JSON編碼的對象。它看起來像它實際上包含一個JSON編碼的字符串(並且JSON編碼的字符串包含一個JSON編碼的對象)。注意左右的字符,當你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);


一個更好的解決辦法是找出爲什麼數據首先是雙重編碼,而不是這樣做。

+0

我不能看到字符串是雙倍時間strigified。 –

+0

@YashGanatra - 再仔細看看?我可以。你可以看到它周圍的引號(如我所說)。 – Quentin

+0

是的,你是對的:)完美。 –