【问题标题】:javascript traverse json objectjavascript遍历json对象
【发布时间】:2012-04-21 18:25:45
【问题描述】:

我一直认为这会很容易...我打算使用下面的 json 来构建路由器对象。我放了一个 console.log,所以我可以有一个断点点,这样我就可以尝试弄清楚如何从 chrome 控制台访问对象属性。但它永远不会进入 for 循环。

主要问题是如何正确地将 JSON 转换为对象以及如何访问它的属性。

<script type="text/javascript">
    $(document).ready(function(){

        $.getJSON('JSON/data.json', function(json) {

            for (var i=0;i<json.length;i++){
                console.log("in for loop");
            }

        });
    });

</script>





{
"_id": {
    "$oid": "4f91f2c9e4b0d0a881cf86c4"
},
"DSC21": {
    "Router": {
        "online": [
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1"
        ],
        "bytes": [
            "59.5721304971465",
            "17014.1911069063",
            "14858.8518936735",
            "6875.20981475265",
            "15157.6891384625",
            "6363.47544785913",
            "29446.2111270486",
            "11517.9296243171",
            "27077.9747917112",
            "19867.79381695"
        ]
    }
},
"DSC22": {
    "Router": {
        "online": [
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1"
        ],
        "bytes": [
            "59.5721304971465",
            "17014.1911069063",
            "14858.8518936735",
            "6875.20981475265",
            "15157.6891384625",
            "6363.47544785913",
            "29446.2111270486",
            "11517.9296243171",
            "27077.9747917112",
            "19867.79381695"
        ]
    }
},
"DSC23": {
    "Router": {
        "online": [
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1"
        ],
        "bytes": [
            "59.5721304971465",
            "17014.1911069063",
            "14858.8518936735",
            "6875.20981475265",
            "15157.6891384625",
            "6363.47544785913",
            "29446.2111270486",
            "11517.9296243171",
            "27077.9747917112",
            "19867.79381695"
        ]
    }
},
"DSC24": {
    "Router": {
        "online": [
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1",
            "1"
        ],
        "bytes": [
            "59.5721304971465",
            "17014.1911069063",
            "14858.8518936735",
            "6875.20981475265",
            "15157.6891384625",
            "6363.47544785913",
            "29446.2111270486",
            "11517.9296243171",
            "27077.9747917112",
            "19867.79381695"
        ]
    }
}

}

【问题讨论】:

  • 检查这个:$.getJSON('JSON/data.json', function(json) {console.log(json); ...}
  • @gdoron 控制台保持空白
  • 请阅读introduction to JavaScript 了解如何使用对象和数组。
  • @FelixKling 很好的链接,谢谢!

标签: javascript ajax json object


【解决方案1】:

变量json已经是一个对象,但它不是一个数组,所以一个典型的for循环是不够的。由于 json.length 未定义,i&lt;json.length 在第一次迭代中失败,您跳过循环。

for (var key in json) {
    // key is your DSCxxx
    // json[key] is the corresponding object
}

【讨论】:

  • 啊,所以它是一个对象数组。
  • 你可能想看看 OP 的this comment...
【解决方案2】:

JSON 在 JavaScript 中是原生可用的,您可以像遍历任何对象或数组一样遍历它。

json["DSC21"]["Router"]["online"][0];    // 1
json.DSC21.Router.online[0];    // equivalent
json.DSC21.Router.online.0;    // INCORRECT

如果您不知道属性的名称并想循环访问它们,请使用 for .. in 构造:

for (var key in json) {
    console.log(key);   // _id, DSC21, DCS22 etc..
    console.log(json[key]);    // { "$oid": "" }, { "Router": ".." } etc.
}

这确实留下了hasOwnProperty 的问题,但如果您只是读取 JSON 数据,这应该不是问题。

【讨论】:

  • “JSON 在 JavaScript 中原生可用” 这是什么意思? JSON 解析器在 JavaScript(从 ES5 起)中原生可用,它将 JSON 转换为对象/数组,仅此而已。
  • 如果里面有嵌套的对象和字符串怎么办?在这种特定情况下如何实现这个解决方案?
  • @xeeB 你能把你的数据结构和你想读的属性贴出来吗?
【解决方案3】:

也许您想知道如何迭代您的对象?

以下是如何做到这一点:

for( var key in json ){
   if( key != '_id'){
      var router = json[key].Router;
      for( var i = 0; i < router.online.length; i++ ){
        console.log(i + ' is online: ', router.online[i]==1?'true':'false');
      }
      etc...
   }
}

【讨论】:

    猜你喜欢
    • 2017-07-10
    • 2023-03-24
    • 2015-09-16
    • 2015-01-11
    相关资源
    最近更新 更多