2017-04-17 52 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