【问题标题】:Printing nested JSON without using variable names在不使用变量名的情况下打印嵌套 JSON
【发布时间】:2014-04-29 23:30:38
【问题描述】:

Web 服务返回以下嵌套的 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]);
}

但是,如果它是嵌套值,它会将值打印为 [object Object],有没有办法继续更深入地迭代嵌套值?

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    试试这个:

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

    BB:添加 + 以防止错误。

    【讨论】:

    • typeof(someObject) 返回“object”而不是“Object”...注意小写“o”
    【解决方案2】:

    您可以递归地执行此操作。

    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]);
        }
      }
    }
    

    【讨论】:

    • 在你的嵌套调用中你需要 data[key] - 否则你只是重复你收到的同一个对象。
    【解决方案3】:

    这当然需要递归

    (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));
    

    【讨论】:

    • 不需要需要递归,但如果您的数据不是大得离谱,递归会有所帮助。
    【解决方案4】:
    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数据,它将递归解析剩余的对象和数组。

    【讨论】:

    • is_object() 和 is_array() 的定义在哪里?
    • 在另一个库中我忘了告诉你,但我已经习惯了,我忘了它不是核心 javascript。我很抱歉。
    【解决方案5】:

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

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

    只要您不担心递归太远(对于 JSON 对象,您可能不需要这样做)。

    您也可以使用队列或堆栈(数组)结构来做到这一点:

    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);
            }       
        }
    }
    

    【讨论】:

    • 您的代码不正确。您传入 obj 但在 for 循环中使用 json_data....json_data 未定义。
    • 很遗憾两者都不起作用,它们只能通过第一级
    • @HeoQue:您只能在第一级看到警报,因为在您的数据中,第一级以下的所有内容都是一个对象,因此循环将查看“Sports”并看到它是一个对象,然后下到“篮球”,看看它也是一个对象,所以它不会alert 用于其中任何一个。将一些 JSON 数据作为数组(“体育”、“名人”等)可能会使事情变得更容易。
    【解决方案6】:

    我猜在您的请求中(假设是 Ajax)您没有指定要返回为“json”的数据类型。

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 2011-04-08
      • 2011-12-09
      相关资源
      最近更新 更多