开发者问题收集

如何在 nodejs 中循环遍历 JSON 数组?

2016-12-09
3241

我试图从 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.
          ...
        },
        {
        ..
        },
2个回答

res 是一个流, data 事件表示收到了部分数据,但可能是也可能不是全部数据。您不太可能一次获得所有数据,因此您需要等到 end 事件触发,此时您拥有整个 JSON 对象:

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-stream ,它可以逐块读取 JSON 并正确处理,这与 JSON.parse 不同。

但是,我建议您不要使用上述任何一种解决方案,而是使用 request ,这大大简化了发出 HTTP 请求和处理响应的这一方面以及其他方面。

Paul
2016-12-09

您可以尝试一些额外的安全验证:

{
  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!");
  }
}

希望有帮助!

Veeresh Devireddy
2016-12-09