2012-04-19 54 views
1

的所有鍵和值說我有一些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'; 
     } 
    } 
} 

「哎呀你編輯不能提交的原因是:

您的文章沒有太多的上下文解釋代碼部分;請更清楚地解釋你的情況。「

這也很令人沮喪。

+0

那麼,你試過嗎?你的問題到底是什麼? – David 2012-04-19 03:27:10

+0

是的,我已經嘗試過,我沒有得到我所需要的 - 對不起,我不是一個嚴肅的編碼器! – 2012-04-19 03:28:14

+0

這很好,你仍然在學習,但如果我們要幫助你,我們需要更多的信息。如果它沒有給出正確的輸出,它會給你什麼輸出?請修改您的問題以顯示您當前收到的結果。 – David 2012-04-19 03:29:26

回答

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 
+0

我不明白_path_在做什麼;-) – 2012-04-19 04:08:46

+0

@JasonWalls'path'正在建立一個字符串,告訴你你所在的集合/對象是什麼。所以每次代碼進入一個新的級別時,它會添加它是當前所在的對象的名稱。這就是這部分'路徑+(路徑?'。':'')+關鍵' – David 2012-04-19 05:20:41

+1

嘿有沒有必要問你obj.hasOwnProperty(鍵)迭代for(var key in obj)循環 - 循環迭代的所有鍵都將存在於json中。 – 2015-04-13 08:26:26

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