无法遍历NodeJS中的JSON对象

时间:2015-02-26 23:52:24

标签: javascript json node.js

我有一个NODEJS程序,它使用xml2js将XML文件转换为JSON并解析它。然后我试图循环遍历json对象并为每个对象显示ID,LastReportTime但是我得到的输出是未定义的

输出

2015-02-26T18:45:35.34-0500 [App/0]   OUT BESAPI
2015-02-26T18:45:35.34-0500 [App/0]   OUT Computer
2015-02-26T18:45:35.34-0500 [App/0]   OUT Computer:undefined
2015-02-26T18:45:35.34-0500 [App/0]   OUT Done

的NodeJS

var fs = require('fs'),
    xml2js = require('xml2js');

var parser = new xml2js.Parser();
fs.readFile('myfile.xml', function(err, data) {
    parser.parseString(data, function (err, result) {

        var jsoniem = JSON.stringify(result);
        console.log(jsoniem);
        var data = JSON.parse(jsoniem);

        for (var obj in data) {
          if (data.hasOwnProperty(obj)) {
            console.log(obj);
            console.log("\n \n");

            if (obj == "BESAPI") {

              for (var prop in data[obj]) {
                console.log(prop);
                if (prop == "Computer") {
                   console.log(prop + ':' + data[obj][prop].ID);
                   console.log(prop + ':' + data[obj][prop].LastReportTime);
                }

              }

            } 

          }

        }

        console.log('Done');
    });

Json(程序从XML转换为JSON后)

{
    "BESAPI": {
        "$": {
            "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
            "xsi:noNamespaceSchemaLocation": "BESAPI.xsd"
        },
        "Computer": [
            {
                "$": {
                    "Resource": "api/computer/2431038"
                },
                "LastReportTime": [
                    "Thu, 26 Feb 2015 14:54:41 +0000"
                ],
                "ID": [
                    "2431038"
                ]
            },
            {
                "$": {
                    "Resource": "api/computer/16710075"
                },
                "LastReportTime": [
                    "Thu, 26 Feb 2015 14:45:18 +0000"
                ],
                "ID": [
                    "16710075"
                ]
            },
            {
                "$": {
                    "Resource": "api/computer/3415985"
                },
                "LastReportTime": [
                    "Thu, 26 Feb 2015 14:50:52 +0000"
                ],
                "ID": [
                    "3415985"
                ]
            }
        ]
    }
}

XML

<?xml version="1.0" encoding="UTF-8"?>
<BESAPI xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BESAPI.xsd">
    <Computer Resource="api/computer/2431038">
        <LastReportTime>Thu, 26 Feb 2015 14:54:41 +0000</LastReportTime>
        <ID>2431038</ID>
    </Computer>
    <Computer Resource="api/computer/16710075">
        <LastReportTime>Thu, 26 Feb 2015 14:45:18 +0000</LastReportTime>
        <ID>16710075</ID>
    </Computer>
    <Computer Resource="api/computer/3415985">
        <LastReportTime>Thu, 26 Feb 2015 14:50:52 +0000</LastReportTime>
        <ID>3415985</ID>
    </Computer>
</BESAPI>

5 个答案:

答案 0 :(得分:4)

考虑你的JSON示例迭代对象似乎无关紧要。此外,不需要首先对数据进行字符串化,然后解析字符串。

fs.readFile('myfile.xml', function(err, data) {
  parser.parseString(data, function (err, result) {

    var jsoniem = JSON.stringify(result);
    console.log(jsoniem);

    result.BESAPI.Computer.forEach(function (el) {
      // Output arrays
      console.log(el.ID);
      console.log(el.LastReportTime);

      // Get first elements
      console.log(el.ID[0]);
      console.log(el.LastReportTime[0]);
    });

  }

  console.log('Done');
});

答案 1 :(得分:1)

似乎你没有迭代计算机阵列。尝试更改内部循环,如下所示:

for (var prop in data[obj]) {
            console.log(prop);
            if (prop == "Computer") {
               for( var cmp in data[obj][prop] ) {
               console.log(prop + ':' + cmp.ID[0]);
               console.log(prop + ':' + cmp.LastReportTime[0]);
             }
            }

          }

更新根据您的JSON将数组表示法添加到ID和LastReportTime

答案 2 :(得分:1)

你又错过了一个循环,因为Computer属性是一个数组数组:

       if (obj == "BESAPI") {

          for (var prop in data[obj]) {
            console.log(prop);
            if (prop == "Computer") {
               // loop over Computer dataseries
               for(var id in data[obj][prop]) {
                   console.log(prop + ':' + data[obj][prop][id].ID);
                   console.log(prop + ':' + data[obj][prop][id].LastReportTime);
               }
            }

          }

答案 3 :(得分:1)

在阅读JSON元素时,我们需要处理索引和数组

for(var i=0; i <data.BESAPI.Computer.length; i++ ){
    var computerData = data.BESAPI.Computer[i];

    alert(computerData.LastReportTime);
}

解决了这个问题。你甚至可以看到工作FIDDLE

答案 4 :(得分:1)

问题原因是你未定义

  

对象数据[obj] [prop]是一个数组而不是一个对象

所以,再次得到你错过的那个数组中的每个对象, 刚刚修改了你的内心&#34;如果&#34;块。

var fs = require('fs'),
    xml2js = require('xml2js');

var parser = new xml2js.Parser();
fs.readFile('myfile.xml', function(err, data) {
    parser.parseString(data, function (err, result) {

        var jsoniem = JSON.stringify(result);
        console.log(jsoniem);
        var data = JSON.parse(jsoniem);

        for (var obj in data) {
          if (data.hasOwnProperty(obj)) {
            console.log(obj);
            console.log("\n \n");

            if (obj == "BESAPI") {

              for (var prop in data[obj]) {
                console.log(prop);


                if (prop == "Computer") {

                   for (var propKeys in prop) {
                      if(data[obj] && data[obj][prop] && data[obj][prop][0]) {
                         console.log(prop, data[obj][prop][0].ID);
                         console.log(prop, data[obj][prop][0].LastReportTime);
                      } 
                   }
                }

              }

            } 

          }

        }

        console.log('Done');
    });
});