2017-04-17 53 views
0

我有一些棘手的數據需要處理。基本上我想給一個扁平的列表結構。給一個平面數據陣列提供結構

用簡單的英語,應該使:

  1. "level":1標籤是數組
  2. "level":2或更高的標籤應該被嵌套在陣列內
  3. 如果沒有"level":1的關鍵,把它添加到一個通用的NoLevel1列表
  4. 它應該組tags只在一起if它們具有相同的值"level":1

我的數據是這樣的:

[{ 
    "title": "Set 1", 
    "tag": [{ 
    "name": "Animals", 
    "level": 1 
    }, 
    { "name": "Cat", 
    "level": 2 
    }, 
    { "name": "Dog", 
    "level": 3 
    } 
] 
}, 
{ 
    "title": "Set 2", 
    "tag": [{ 
    "name": "Fruits", 
    "level": 1 
    }, 
    { "name": "Apple", 
    "level": 2 
    }] 
}, 
{ 
    "title": "Set 3", 
    "tag": [{ 
    "name": "Fruits", 
    "level": 1 
    }, 
    { "name": "Orange", 
    "level": 3 
    }] 
}, 
{ 
    "title": "Set 4", 
    "tag": [{ 
    "name": "Cars", 
    "level": 2 
    }] 
}, 
{ 
    "title": "Set 5", 
    "tag": [{ 
    "name": "Random!", 
    "level": 3 
    }] 
}] 

我所需的輸出是這樣的:

[{ 
    "name": "Animals", 
    "level":1, 
    "tag_child": [{ 
    "name": "Cat", 
    "level": 2 
    }, 
    { "name": "Dog", 
    "level": 3 
    }] 
}, 
    { 
    "name": "Fruits", 
    "level":1, 
    "tag_child": [{ 
    "name": "Apple", 
    "level": 2 
    }, 
    { "name": "Orange", 
    "level": 3 
    }] 
}, 
    { 
    "name": "NoLevel1", 
    "level":1, 
    "tag_child": [{ 
    "name": "Cars", 
    "level": 2 
    }, 
    { "name": "Random!", 
    "level": 3 
    }] 
}] 

我已經加載的數據,但還沒有在給數據的條件進一步得到結構體。

import json 

with open("Test.json") as json_file: 
    l = json_data = json.load(json_file) 
for i in thedata: 
    if i['tag']['level'] > 1: 

回答

1

我沒有測試這個,但像這樣的東西應該工作。如果這不是你想要的,請自行修改。但肯定這應該讓你開始。

import json 
with open("Test.json") as json_file: 
    json_data = json.load(json_file) 
    generic = [] 
    result = [] 
for i in json_data: 
    if any(d['level'] == 1 for d in i['tag']): 
     tag_data = {} 
     tag_child = [] 
     for tag in i['tag']: 
      if tag['level'] == 1: 
       tag_data['name'] = tag['name'] 
       tag_data['level'] = 1 
      else: 
       tag_child.append(tag) 
     filtered = {tuple((k, d[k]) for k in sorted(d) if k in ['name']): d for d in tag_child} 
     tag_data['tag_child'] = list(filtered.values()) 
     if any(d['name'] == tag_data['name'] for d in result): 
      for t in result: 
       if t['name'] == tag_data['name']: 
        t['tag_child'] = t['tag_child'] + tag_child 
      filtered = {tuple((k, d[k]) for k in sorted(d) if k in ['name']): d for d in t['tag_child']} 
      t['tag_child'] = list(filtered.values()) 
     else: 
      result.append(tag_data) 
    else: 
     for tag in i['tag']: 
      generic.append(tag) 
tag_data = {} 
tag_data['name'] = 'NoLevel1' 
tag_data['level'] = 1 
tag_data['tag_child'] = generic 
result.append(tag_data) 
print(json.dumps(result)) 
+0

這幾乎就是 - 但是它將每個「level」:1'視爲一個新項目,而當它們相同時應該將它們組合。這就是你的代碼產生的結果:http://dpaste.com/3D1NHZC – Ycon

+0

我剛剛給你開始一些東西。我現在做了一些改變。你可以檢查一下嗎。 – Sajin

+0

真棒,幾乎在那裏。最後一個變化是結果在'tag_child'裏面重複。我如何修改只能說唯一的「名稱」值? – Ycon