2010-11-05 32 views
5

Web服务返回以下嵌套的JSON对象:印刷嵌套JSON不使用变量名

{"age":"21-24","gender":"Male","location":"San Francisco, CA","influencer score":"70-79","interests":{"Entertainment":{"Celebrities":{"Megan Fox":{},"Michael Jackson":{}},},"Social Networks & Online Communities":{"Web Personalization": {},"Journals & Personal Sites": {},},"Sports":{"Basketball":{}},},"education":"Completed Graduate School","occupation":"Professional/Technical","children":"No","household_income":"75k-100k","marital_status":"Single","home_owner_status":"Rent"} 

我只是想通过这个对象没有指定属性名进行迭代,我想下面的代码:

for (var data in json_data) { 
    alert("Key:" + data + " Values:" + json_data[data]); 
} 

然而,如果它是一个嵌套值,它将打印值为[对象对象],是否有任何方法可以更深入地反复嵌套值?

回答

6

试试这个:

function iter(obj) { 
    for (var key in obj) { 
    if (typeof(obj[key]) == 'object') { 
     iter(obj[key]); 
    } else { 
     alert("Key: " + key + " Values: " + obj[key]); 
    } 
    } 
} 

BB:加+,以防止错误。只要你不担心递归太远(你也许并不需要用JSON对象)

function alertObj(obj) { 
    for (var data in obj) { 
     if(typeof(obj[data]) === "object") 
      alertObj(obj[data]); 
     else 
      alert("Key:" + data + " Values:" + obj[data]); 
    } 
} 

+0

typeof(someObject)返回“object”而不是“Object”...注意小写的“o” – 2010-11-05 21:05:48

+0

好的。 :) 谢谢! – 2010-11-05 21:07:16

3

您可以递归执行此操作。

function alertobjectKeys(data) { 
    for (var key in data) { 
    if (typeof(data[key]) == "object" && data[key] != null) { 
     alertobjectKeys(data[key]); 
    } else { 
     alert("Key:" + key + " Values:" + data[key]); 
    } 
    } 
} 
+0

在你的嵌套调用中你需要数据[键] - 否则你只是重申你收到的同一个对象。 – 2010-11-05 21:03:41

+0

@ g.d.d.c ...谢谢...我修正了它 – 2010-11-05 21:09:18

0

你总是可以创建一个递归函数。

也可以与队列或堆栈(阵列)结构做到这一点:

function alertObj_queue(obj) { // Breadth-first 
    var arrPrint = [{key:"Object", data:obj}]; // Initialize array with original object 

    for(var i = 0; i < arrPrint.length; i++) { 
     if(typeof(arrPrint[i].data) === "object") { 
      for(var k in arrPrint[i].data) { // Add each to end of array 
       arrPrint.push({key: k, data: arrPrint[i].data[k]}); 
      } 
      alert("Object key: " + arrPrint[i].key); 
     } else { 
      alert("Key:" + arrPrint[i].key + " Values:" + arrPrint[i].data); 
     } 
    } 
} 

function alertObj_stack(obj) { // Depth-first 
    var arrPrint = [{key:"Object", data:obj}]; // Initialize array with original object 

    while(arrPrint.length) { 
     var o = arrPrint.pop(); 
     if(typeof(o.data) === "object") { 
      for(var k in o.data) { // Add each to end of array 
       arrPrint.push({key: k, data: o.data[k]}); 
      } 
      alert("Object key: " + o.key); 
     } else { 
      alert("Key:" + o.key + " Values:" + o.data); 
     }  
    } 
} 
+0

你的代码不正确。你传入obj,但在for循环中使用json_data .... json_data未定义。 – 2010-11-05 21:04:31

+0

不幸的是两者都不起作用,他们只能通过第一级 – 2010-11-06 00:07:39

+0

@HeoQue:你只能看到第一级的警报,因为在你的数据中,第一级以下的所有东西都是对象,所以循环会看“体育”和看到它是一个对象,然后下降到“篮球”,并看到它也是一个对象,所以它不会“警惕”任何这些对象。这可能会让您更容易将一些JSON数据作为数组(“体育”,“名人”等)。 – palswim 2010-11-08 18:29:18

0

当然这需要递归

(function(obj) { 
    for (var key in obj) if (obj.hasOwnProperty(key)) { 
    if (typeof obj[key] == 'object' && obj[key] !== null) 
     arguments.callee(obj[key]); 
    else 
     alert("Key: " + key + " Values: " + obj[key]); 
    } 
)(json_data)); 
+0

不需要**递归,但如果数据不是非常大,则递归可以提供帮助。 – palswim 2010-11-08 18:57:32

0
function recursiveParse(variable) { 
    for (var key in variable) { 
     if ((is_object(variable[key])) || (is_array(variable[key]))) { 
      recursiveParse(variable[key]); 
     } else { 
      // Process variable here 
     } 
    } 
} 

然后,只需调用与所述参数是该函数json数据,它将递归地解析剩余的对象和数组。

+0

其中is_object()和is_array()的定义是? – 2010-11-06 00:06:21

+0

在另一个库中,我忘了告诉你,但我很习惯,我忘了它不是核心的JavaScript。我道歉。 – 2010-11-08 18:19:04

0

我猜你的请求(假设它是Ajax),你没有指定dataType作为'json'返回。