python - json ,如何制作 json 平面
python - json , how to make a json flat
所以我有一个包含两个组的嵌套 json,每个组都有一个包含更多子组的字段
我想弹出所有子组以展平 json
并删除子组字段
正确的做法是什么
JSON :
[
{
"groupId": "a_group",
"version": "2.0.1",
"type": "jar",
"sub_group": [
{
"groupId": "a_1",
"version": "2.0.0",
"type": "jar",
"sub_group": []
},
{
"groupId": "a_2",
"version": "2.0.1",
"type": "jar",
"sub_group": [
{
"groupId": "a_1",
"version": "2.0.0",
"type": "jar",
"sub_group": []
},
],
}
],
},
{
"groupId": "c_group",
"version": "1.9.1",
"type": "jar",
"sub_group": [
{
"groupId": "a_1",
"version": "2.0.0",
"type": "jar",
"sub_group": []
},
],
},
}
这是预期的结果:
我需要弹出所有子组并使它们显示为平面 json 像这样
[{
"groupId": "a_group",
"version": "2.0.1",
"type": "jar",
"sub_group": []
},
{
"groupId": "a_1",
"version": "2.0.0",
"type": "txt",
"sub_group": []
},
{
"groupId": "a_2",
"version": "2.0.1",
"type": "jar",
"sub_group": []
},
{
"groupId": "c_group",
"version": "1.9.1",
"type": "jar",
"sub_group": []
},
]
好吧,我有一个面试问题与你的问题非常相似
这是我的回答:
def flatten_json(self,json_data) ->json:
'''
:param json_data: The json file to work on
:return: A json
'''
out = []
def flatten(key):
if isinstance(key, dict):
if key['sub_group']:
flatten(key['sub_group'])
key['sub_group'] = []
out.append(key)
else:
out.append(key)
# in case we have multiple items in the list[]
elif isinstance(key, list):
for val in key:
flatten(val)
flatten(json_data)
return json.dumps(out)
这不是最好的解决方案,但效果很好
我冒昧地假设 sub_group 的名称始终是子组
我使用了递归并且我正在使用 isinstance 方法处理移动到字典中以检查我是否正在查看字典,如果不是那么这意味着我有一个包含其他内容的列表
我在 elif 部分处理它并遍历列表中的每个项目
所以我有一个包含两个组的嵌套 json,每个组都有一个包含更多子组的字段 我想弹出所有子组以展平 json 并删除子组字段
正确的做法是什么
JSON :
[
{
"groupId": "a_group",
"version": "2.0.1",
"type": "jar",
"sub_group": [
{
"groupId": "a_1",
"version": "2.0.0",
"type": "jar",
"sub_group": []
},
{
"groupId": "a_2",
"version": "2.0.1",
"type": "jar",
"sub_group": [
{
"groupId": "a_1",
"version": "2.0.0",
"type": "jar",
"sub_group": []
},
],
}
],
},
{
"groupId": "c_group",
"version": "1.9.1",
"type": "jar",
"sub_group": [
{
"groupId": "a_1",
"version": "2.0.0",
"type": "jar",
"sub_group": []
},
],
},
}
这是预期的结果: 我需要弹出所有子组并使它们显示为平面 json 像这样
[{
"groupId": "a_group",
"version": "2.0.1",
"type": "jar",
"sub_group": []
},
{
"groupId": "a_1",
"version": "2.0.0",
"type": "txt",
"sub_group": []
},
{
"groupId": "a_2",
"version": "2.0.1",
"type": "jar",
"sub_group": []
},
{
"groupId": "c_group",
"version": "1.9.1",
"type": "jar",
"sub_group": []
},
]
好吧,我有一个面试问题与你的问题非常相似
这是我的回答:
def flatten_json(self,json_data) ->json:
'''
:param json_data: The json file to work on
:return: A json
'''
out = []
def flatten(key):
if isinstance(key, dict):
if key['sub_group']:
flatten(key['sub_group'])
key['sub_group'] = []
out.append(key)
else:
out.append(key)
# in case we have multiple items in the list[]
elif isinstance(key, list):
for val in key:
flatten(val)
flatten(json_data)
return json.dumps(out)
这不是最好的解决方案,但效果很好 我冒昧地假设 sub_group 的名称始终是子组 我使用了递归并且我正在使用 isinstance 方法处理移动到字典中以检查我是否正在查看字典,如果不是那么这意味着我有一个包含其他内容的列表 我在 elif 部分处理它并遍历列表中的每个项目