【问题标题】:How to navigate in nested JSON如何在嵌套 JSON 中导航
【发布时间】:2011-07-31 17:14:06
【问题描述】:

我有嵌套的 JSON 对象,例如

{"baseball": 
            {"mlb": 
                   {"regular": 
                             {"_events": [{"start_time": "2011-07-31 17:35", "lines":
[{"comment": "", "coeff": "2.35", "title": "2", "old_coeff": "2.35", "is_main": true}, 
{"comment": "", "coeff": "1.59", "title": "2", "old_coeff": "1.59", "is_main": true}, 
{"comment": "", "coeff": "1.59", "title": "2", "old_coeff": "1.59", "is_main": true}, 
{"comment": "", "coeff": "2.35", "title": "2", "old_coeff": "2.35", "is_main": true}], 
"members": ["atlanta", "florida"]
                                 }
                                  ]
                                   }}}}

我还需要获取 _events 数组并对其进行解析。但我不知道 _events 之前的单元格中会有什么以及它们将如何。我如何使用这种结构?

【问题讨论】:

  • 恐怕这是什么时候使用 XML 而不是 JSON 的一个很好的例子,因为你可以使用 XPath 来做类似的事情。
  • @Gabi Purcaru 它是 JSON !!!尝试在jsonlint.com 验证它,你会为此投票,哇!
  • @Bakudan 不是在 OP 编辑​​它之前。

标签: javascript json


【解决方案1】:
function recursiveGetProperty(obj, lookup, callback) {
    for (property in obj) {
        if (property == lookup) {
            callback(obj[property]);
        } else if (obj[property] instanceof Object) {
            recursiveGetProperty(obj[property], lookup, callback);
        }
    }
}    

然后像这样使用它:

recursiveGetProperty(yourObject, '_events', function(obj) {
    // do something with it.
});

这是一个有效的 jsFiddle:http://jsfiddle.net/ErHng/注意:它输出到控制台,所以你需要 Ctrl+Shift+J/Cmnd+Option +I 在 chrome 中或在 Firefox 中打开 firebug 然后重新运行)

【讨论】:

  • 我添加了键盘快捷键来获取 mac 上的网络检查器。
  • 如果我发送 'members' 作为参数,它会显示maximum stack size exceeded
【解决方案2】:

如果结构已知:

假设您在名为 input 的字符串中有上述内容(并且 JSON 是有效的):

var obj = JSON.parse(input) // converts it to a JS native object.
// you can descend into the new object this way:
var obj.baseball.mlb.regular._events

作为警告,早期版本的 IE 没有 JSON.parse,因此您需要为此使用框架。

如果结构未知:

// find the _events key
var tmp = input.substr(input.indexOf("_events"))
// grab the maximum array contents.
tmp = tmp.substring( tmp.indexOf( "[" ), tmp.indexOf( "]" ) + 1 );
// now we have to search the array
var len = tmp.length;
var count = 0;
for( var i = 0; i < len; i++ )
{
    var chr = tmp.charAt(i)
    // every time an array opens, increment
    if( chr == '[' ) count++;
    // every time one closes decrement
    else if( chr == ']' ) count--;
    // if all arrays are closed, you have a complete set
    if( count == 0 ) break;
}
var events = JSON.parse( tmp.substr( 0, i + 1 ) );

【讨论】:

  • “但我不知道 _events 之前的单元格中会包含什么以及它们将如何。”以及如何使用答案?
【解决方案3】:

在这种情况下,我发现最简单的做法是转到JSFiddle,将您的 json 作为变量粘贴:

var json = {"baseball": ... etc.
console.log(json);

然后使用 Chrome,“查看”->“开发人员”->“Javascript 控制台”开始尝试数据结构的外观,以构建您的解析功能。

然后开始试验结构。例如。

console.log(json.baseball.mlb.regular._events);

或者如果你打开 JQuery:

$.each(json.baseball.mlb.regular._events, function(i, item){
  $.each(item.lines,function(i,line){
    console.log(line.coeff);
  });
}); 

如果您在将此 JSON 实际加载到变量中时遇到问题,您需要 JSON.parse 一个通过 AJAX 调用检索到的字符串,我怀疑。

【讨论】:

  • 问题是我不知道会是什么结构,我只需要递归去分区_events,然后解析数据数组。所以,我不知道如何为这个任务进行递归=)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
  • 2020-02-03
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多