列出JSON的所有键和值

时间:2012-04-19 03:24:44

标签: json

说我有一些JSON,如下所示:

{
"items":
    {
        "item":
            [
                {
                    "id": "0001",
                    "type": "donut",
                    "name": "Cake",
                    "ppu": 0.55,
                    "batters":
                        {
                            "batter":
                                [
                                    { "id": "1001", "type": "Regular" },
                                    { "id": "1002", "type": "Chocolate" },
                                    { "id": "1003", "type": "Blueberry" },
                                    { "id": "1004", "type": "Devil's Food" }
                                ]
                        },
                    "topping":
                        [
                            { "id": "5001", "type": "None" },
                            { "id": "5002", "type": "Glazed" },
                            { "id": "5005", "type": "Sugar" },
                            { "id": "5007", "type": "Powdered Sugar" },
                            { "id": "5006", "type": "Chocolate with Sprinkles" },
                            { "id": "5003", "type": "Chocolate" },
                            { "id": "5004", "type": "Maple" }
                        ]
                },

                ...

            ]
    }
}

我想要一个函数来返回制表符分隔数据列表(其中 - >是一个制表符)。像这样:

items.item.length -> 1
items.item[0].id -> 0001
items.item[0].type -> donut
items.item[0].name -> Cake
items.item[0].ppu -> 0.55
items.item[0].batters.batter.length -> 4
items.item[0].batters.batter[0].id -> 1001
items.item[0].batters.batter[0].type -> Regular
items.item[0].batters.batter[1].id -> 1002
items.item[0].batters.batter[1].type -> Chocolate
items.item[0].batters.batter[2].id -> 1003
items.item[0].batters.batter[2].type -> Blueberry
items.item[0].batters.batter[3].id -> 1004
items.item[0].batters.batter[3].type -> Devil's Food
items.item[0].topping.length -> 7
items.item[0].topping[0].id -> 5001
items.item[0].topping[0].type -> None
items.item[0].topping[0].id -> 5002
items.item[0].topping[0].type -> Glazed

...

我在考虑像

这样的东西
function json2txt(obj) {
var txt = '';
    for (var key in obj) {
       if (obj.hasOwnProperty(key)) {
          if ("object" == typeof(obj[key])) {
             json2txt(obj[key]);
          } else txt += obj + '\t' + obj[key] + '\r';
       }
    }
}

“哎呀!无法提交你的编辑,因为:

您的帖子没有太多上下文来解释代码部分;请更清楚地解释你的情景。“

这也非常令人沮丧。

2 个答案:

答案 0 :(得分:6)

你在使用递归函数的正确轨道上。您需要为该函数添加一个参数,但它需要知道对象中当前点的路径。

另外,请使用\n,而不是\r

var inputObject = {
    items: { 
        foo: [ 'apples', 'oranges', 'peaches' ],
        bar: 'baz',
        spam: 'eggs'
     }
};
function json2txt(obj, path)
{
    var txt = '';
    for (var key in obj)
    {
        if (obj.hasOwnProperty(key))
        {
            if ('object' == typeof(obj[key]))
            {
                txt += json2txt(obj[key], path + (path ? '.' : '') + key);
            } 
            else
            {
                txt += path + '.' + key + '\t' + obj[key] + '\n';
            }
        }
    }
    return txt;
}
json2txt(inputObject, '');

有趣的问题!

对于您的示例数据,我的代码给出了:

items.item.0.id 0001
items.item.0.type   donut
items.item.0.name   Cake
items.item.0.ppu    0.55
items.item.0.batters.batter.0.id    1001
items.item.0.batters.batter.0.type  Regular
items.item.0.batters.batter.1.id    1002
items.item.0.batters.batter.1.type  Chocolate
items.item.0.batters.batter.2.id    1003
items.item.0.batters.batter.2.type  Blueberry
items.item.0.batters.batter.3.id    1004
items.item.0.batters.batter.3.type  Devil's Food
items.item.0.topping.0.id   5001
items.item.0.topping.0.type None
items.item.0.topping.1.id   5002
items.item.0.topping.1.type Glazed
items.item.0.topping.2.id   5005
items.item.0.topping.2.type Sugar
items.item.0.topping.3.id   5007
items.item.0.topping.3.type Powdered Sugar
items.item.0.topping.4.id   5006
items.item.0.topping.4.type Chocolate with Sprinkles
items.item.0.topping.5.id   5003
items.item.0.topping.5.type Chocolate
items.item.0.topping.6.id   5004
items.item.0.topping.6.type Maple

答案 1 :(得分:2)

帕特里克做得很好。这是一个稍微简单的版本,在OSX 10.6.8上用jsc测试:

function json2txt(obj)
{
  var txt = '';
  var recurse = function(_obj) {
    if ('object' != typeof(_obj)) {
      txt += ' = ' + _obj + '\n';
    }
    else {
      for (var key in _obj) {
        if (_obj.hasOwnProperty(key)) {
          txt += '.' + key;
          recurse(_obj[key]);
        } 
      }
    }
  };
  recurse(obj);
  return txt;
}

var obj = JSON.parse(arguments[0]);
print(json2txt(obj));