2011-01-08 97 views
5

我目前正在试图弄清楚如何遍历JSON响应中的所有对象。我的对象可能有无尽的子对象,他们也可能有无尽的子对象。jQuery和迭代JSON对象

{ 
    "obj1" : { 
     "obj1.1" : "test", 
     "obj1.2" : { 
     "obj1.1.1" : true, 
     "obj1.1.2" : "test2", 
     "obj1.1.3" : { 
      ... // etc 
     } 
     } 
    } 
} 

我只是想知道是否有一个开箱即用的脚本可以处理这种类型的对象?

+0

+1为名称和有趣的问题。我认为我不一定会使用你正在使用的数据结构类型,看起来它可能在两端都是昂贵的。这可能是更好的解决方案,不需要走树。也许你可以详细说明你想用数据做什么(当你找到有趣的位)。 – Gabriel 2011-01-08 04:26:59

+0

通常最好知道响应的一般格式。 JSON的强大之处在于能够通过键获取对象。如果您现在知道键或值是什么,也不知道格式是什么,那么JSON可能不适合您。 – Alex 2011-01-08 05:02:48

+0

请勿在您的帖子中使用[签名或标语](http://stackoverflow.com/faq#signatures)。 – meagar 2011-01-21 22:41:06

回答

4

这里有一个小功能,跟踪你走路的深度通过树,沿途停靠,让你做执行操作(没有指定你真正想要做什么,或当):

function dig(blob, depth) { 
    var depth = depth || 0; // start at level zero 
    for(var item in blob) { 
    console.log('depth: ' + depth + ': ' + item); // do something real here 
    if(typeof blob[item] === 'object') { 
     dig(blob[item], ++depth); // descend 
    } else { // simple value, leaf 
     console.log(' => ' + blob[item]); // do something real here 
    } 
    } 
}  

console.log(dig(obj)); 

假设obj是你的JSON作为上面,这应该给你喜欢的东西(未测试):

depth: 0: obj1 
depth: 1: obj1.1 
=> test 
depth: 1: obj1.2 
// etc. 
1

一旦你解析的JSON成一个对象,你需要实现一个树沃克(递归函数)来找到你感兴趣的特定值。

然而,JOrder可能会帮助你它提供了大量的数据管理功能,这可以帮助您编写一个树型漫游器。并做一个好的,高性能的搜索和排序。

https://github.com/danstocker/jorder

0

jQuery的JavaScirpt库刚刚方法:

var jsonObject = $.parseJSON('{ 
    "obj1" : { 
     "obj1.1" : "test", 
     "obj1.2" : { 
     "obj1.1.1" : true, 
     "obj1.1.2" : "test2", 
     "obj1.1.3" : { 
      ... // etc 
     } 
     } 
    } 
}'); 

alert(jsonObject['obj1']); 

parseJSON() method接受JSON字符串(这是你会从一个JSON请求得到了什么),并返回一个JavaScript对象。从那里你可以像使用任何JavaScript对象一样访问数据。

+0

哦,我认为魔鬼知道如何让JSON成为一个对象。 – ocodo 2011-01-08 04:10:26

2

你在问题中代表的不是JSON,而是JavaScript Object Literal。不同之处在于一个字符串,一个是实际的文字对象,可以在JavaScript中使用而无需进一步转换。

要遍历一个JS Object Literal,使用一个简单的递归for循环。你不需要一个单独的库。

var walk = function(o){ 
    for(var prop in o){ 
    if(o.hasOwnProperty(prop)){ 
     var val = o[prop]; 
     console.log('Value = ',val, ', Prop =', prop, ', Owner=',o); 
     if(typeof val == 'object'){ 
     walk(val); 
     } 
    } 
    } 
}; 

walk({ 'foo':'bar', biz: { x: 'y' } }); 
0

我使用此代码段穿行de json。基本上,当节点是一个对象时,我递归地调用相同的函数。希望你觉得它有用。

正如你所见,它需要jQuery。它也可以在不使用相同想法的情况下完成。

function recorrer(json) {

$.each(json, function(index, value) { 


     switch ($.type(value)){ 

      case 'string': 
        console.log(value) //for example      
       break; 

      case 'object': 
       recorrer(value); // recursiva      
       break; 
     } 



}); 

};