📅  最后修改于: 2023-12-03 15:23:26.790000             🧑  作者: Mango
在Python中,JSON是一种非常常用的数据格式,然而当我们需要对JSON对象进行处理的时候,有时候会遇到需要将嵌套结构的JSON对象展平成键值对的情况。这个过程也被称为“flatten”。
最常见的解决方案是使用递归。这种方法进行操作的依据是嵌套的JSON对象可以视为树状结构。每个嵌套的JSON对象都有一个“node”或“parent”和一个或多个子节点。
以下是使用递归来展平嵌套JSON对象的代码片段:
def flatten_json(nested_json):
out = {}
def flatten(sub_json, name=''):
if type(sub_json) is dict:
for sub_key in sub_json:
flatten(sub_json[sub_key], name + sub_key + '.')
elif type(sub_json) is list:
i = 0
for sub_elem in sub_json:
flatten(sub_elem, name + str(i) + '.')
i += 1
else:
out[name[:-1]] = sub_json
flatten(nested_json)
return out
该函数接受一个嵌套的JSON对象,并返回一个已展平的键值对。您可以使用以下代码测试该函数:
import json
nested_json = {
'a': {
'b': {
'c': 1,
'd': 2
}
},
'e': [3, 4],
'f': {
'g': 'hello'
}
}
flat_json = flatten_json(nested_json)
print(json.dumps(flat_json, indent=4))
输出:
{
"a.b.c": 1,
"a.b.d": 2,
"e.0": 3,
"e.1": 4,
"f.g": "hello"
}
jsonpath是一种语法,在JSON对象中通过路径查询或筛选数据。可以使用jsonpath.flatten函数将JSON对象展平为键值对格式。
以下是使用jsonpath.flatten函数将嵌套JSON对象展平成键值对的代码片段:
import json
from jsonpath_ng import jsonpath, parse
from jsonpath_ng.ext import parse
nested_json = {
'a': {
'b': {
'c': 1,
'd': 2
}
},
'e': [3, 4],
'f': {
'g': 'hello'
}
}
jsonpath_expr = parse('$..*')
flat_json = {match.full_path: match.value for match in jsonpath_expr.find(nested_json)}
print(json.dumps(flat_json, indent=4))
该函数使用jsonpath语法查询JSON对象的所有键和值,然后将它们一一展开为键值对。
输出:
{
"['a']['b']['c']": 1,
"['a']['b']['d']": 2,
"['e'][0]": 3,
"['e'][1]": 4,
"['f']['g']": "hello"
}
本文介绍了两种将嵌套的JSON对象展平为键值对的方法。使用递归的方法需要自己实现,但可以完全掌控展开的过程。使用jsonpath函数需要安装jsonpath和jsonpath-ng扩展,但可以更快地展开JSON对象。请选择适合您的需求和情况的方式。