2017-07-27 7 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-checkerでチェックしてください:https://jsonlint.com/ – Bee157

+0

JSON.parse行の後にconsole.log(データ)を試してみてください。出力は –

答えて

1

xhr.responseTextには、JSONエンコードオブジェクトが含まれていると想定しています。実際にはの文字列でエンコードされたJSONが含まれているようです(JSONエンコードされた文字列にはJSONエンコードされたオブジェクトが含まれています)。 console.logと入力したときにの文字が"になることに注意してください。

つまり、オブジェクトがJSONとしてエンコードされていて、JSON として再度符号化されています。です。

JSON.parse(xhr.responseText)を実行すると、JSONエンコーディングの最初のレイヤーがデコードされます。これは、オブジェクトを表すJSONの文字列を返します。

その文字列にはresultというプロパティがありません。

あなたのオブジェクトを取得するためにJSONへの第2のセットをデコードする必要があります。より良い解決策は、理由を把握することです

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

文字列が倍精度化されていることがわかりません。 –

+0

@YashGanatra - 近くに見える?できます。あなたがログに記録されているとき(私が言ったように)それの周りの引用符を見ることができます。 – Quentin

+0

はい、あなたは正しいです。完璧です。 –

関連する問題