2016-12-09 4 views
0

私はページに表示するjson配列から値を読み取ろうとしています。私は以下のコードで試しましたが、できませんでした。私はこれを行うために長い時間をかけていました、私はここで何が間違っているのかアドバイスしてください。nodejsでJSON配列をループする方法は?

また、私はJSON.parse-予期しない入力エラーを行うことができません。

http.request(options, function(res) { 
res.on('data', function (result) { 
console.log(result);//Displaying below format of result without any error 
console.log(result.Reference[0].name); Error //TypeError: Cannot read property '0' of undefined. 
console.log(result.Reference.length);//Error TypeError: Cannot read property 'length' of undefined 

JSON形式:結果を印刷

{ 
     "Reference": [ 
      { 
       "name": "xxxxxxxx", 
       "typeReference": { 
       "articulation": 0, 
       "locked": false, 
       "createdBy": { 
        "userName": "System", 
           }, 
       "lastModifiedBy": { 
            "userName": "System", 
           }, 

       "lastModified": 1391084398660, 
       "createdOn": 1391084398647, 
       "isSystem": true 
      }, 
      "communityReference": { 
       "name": "xxxxxx", 
       "language": "English", 
       "sbvr": false, 
       "parentReference": { 
        "name": "xxxxx", 
        "sbvr": false, 
        "meta": false, 
        "parentReference": null, 
        "locked": false, 
        "createdBy": { 
         "userName": "xxxxx", 
          }, 
        "lastModifiedBy": { 
         "userName": "xxxxx", 
          }, 

        "lastModified": 1459185726230, 
        "createdOn": 1456337723119, 
        "isSystem": false 
       }, 
       "locked": false, 
       "createdBy": { 
        "userName": "xxxxx", 
          }, 
       "lastModifiedBy": { 
        "userName": "xxxxxx", 
          }, 

       "lastModified": 1472655031590, 
       "createdOn": 1472654988012, 
       "isSystem": false 
      }, 
      "locked": false, 
      "createdBy": { 
        "userName": "xxxxx", 

      }, 
      "lastModifiedBy": { 

       "userName": "xxxxx", 
       "firstName": "xxxxx", 

      }, 

      "lastModified": 1473171981520, 
      "createdOn": 1472655253366, 
      "isSystem": false 
     }, 
     { 
     "name":"yyyyyy", same attribute type as above. 
      ... 
     }, 
     { 
     .. 
     }, 
+0

'result'が文字列でないことを確認しましたか? – gyre

+0

'JSON.parse(result)'を実行したときに予期しない入力エラーが発生した場合、有効なJSONではない可能性があります。 – earl3s

+0

resultが文字列の場合は、まずオブジェクトを 'var obj = JSON.parse(result);に変換する必要があります。 obj.Reference [0]; ' – BrunoLM

答えて

2

resストリームであり、dataイベントは、それがいくつかのデータを受信したことを示し、それは、またはしない可能性のあるすべてのデータであってもよいです。一度にすべてのデータを取得する可能性じゃないので、あなたは、あなたが全体のJSONオブジェクトを持っている場合、endイベントが発生するまで待つ必要があります。

var json = ''; 
res.on('data', function (chunk) { 
    json += chunk; 
}); 
res.on('end', function () { 
    var result = JSON.parse(json); 
    console.log(result.Reference[0].name); 
}); 

たり、JSONのチャンクで読み取ることができjson-streamを使用することができますJSON.parseとは異なり、チャンクで正しく処理します。

ただし、上記の解決策のいずれかを使用せず、代わりにrequestを使用することをお勧めします。これにより、HTTP要求を作成し、応答を処理することが大幅に簡素化されます。

+0

私は依頼する方法を変更し、現在はうまく働いています。コードを削除して答えを受け入れます。 – user2848031

+0

こんにちは@ user2848031、私はあなたのお手伝いをしてうれしいです!私は私の答えからコードを削除するつもりはありません。なぜなら、最初に問題を引き起こしていたものの説明の一部としてそれを見るからです。私はその答えの不可欠な部分だと思います。むしろ、 'request'モジュールだけを記述した答えを受け入れるならば、その答えを追加してそれを自己承諾することができます。そうでなければ、私の答えがあなたの問題を完全に解決したように感じるなら、 – Paulpro

+0

私は基本的な妥当性検査、エラーチェック、およびメンバーからオブジェクトを直接読み取ろうとせずにこの答えをサポートしていません。 –

-2

あなたは、いくつかの追加と安全検証でこれを試すことができます。

{ 
    if (result) { 
    var data = (typeof result == "string") ? JSON.parse(result) : result; 
    if (data.hasOwnProperty("Reference")) { 
     for(var i = 0; i < data.Reference.length; i++;) { 
     try { 
      var reference = data.Reference[i]; 
      console.log("Name:" + reference.name); 
      //Your app logic 
     } catch(e) { 
      //In case if any invalid references, then continue with others 
      console.warn("Error processing reference - " + e); 
     } 
     } 
    } else { 
     console.warn("No References were found!"); 
    } 
    } else { 
    console.error("Invalid JSON!"); 
    } 
} 

はそれが役に立てば幸い!

+0

自分の意見をサポートするだけのコメントなしに他の回答を投票してはいけません。これは、基本的な検証ではるかに優れており、他の解答よりも安全に実行できます。 –

+1

私はdownvotedしていませんでしたが、私がしたようにそのコメントをした後、あなたの答えは、OPが言った 'JSON.parse'を使っているという事実と共に、私は決めました。 – Paulpro

関連する問題