在Python中展平 JSON 对象
JSON(JavaScript Object Notation)是一种数据交换格式,它是人类可读的文本,用于传输数据,尤其是在 Web 应用程序和服务器之间。 JSON 文件将类似于Python中的嵌套字典。要将文本文件转换为 JSON, Python中有一个json
模块。该模块内置Python标准模块,因此无需外部安装。
扁平化的 json 什么都不是,但不存在嵌套,只存在键值对。
例子:
Unflattened JSON:
{‘user’ :{‘Rachel’:{‘UserID’:1717171717,
‘Email’: ‘rachel1999@gmail.com’,
‘friends’: [‘John’, ‘Jeremy’, ‘Emily’]}}}
Flattened JSON:
{‘user_Rachel_friends_2’: ‘Emily’, ‘user_Rachel_friends_0’: ‘John’, ‘user_Rachel_UserID’: 1717171717, ‘user_Rachel_Email’: ‘rachel1999@gmail.com’, ‘user_Rachel_friends_1’: ‘Jeremy’}
需要扁平化 JSON
需要扁平化 JSON 的原因有很多,例如为了更好和更易于理解的视图,即只有键值对存在而没有任何嵌套。它还允许以可读但更详细的方式实现特定于上下文的安全性和约束。
扁平化 JSON 的方法
有很多方法可以扁平化 JSON。使用json-flatten
库有一种递归方式和另一种方式。
- 递归方法: 现在我们可以通过递归的方法来展平字典数组,这很容易理解。递归方法比使用
- 使用 flatten_json 库:json-flatten 库提供了将 JSON 对象展平为单个键值对并将该字典解展为 JSON 对象的函数。
安装库
为了使用 flatten_json 库,我们需要安装这个库。 flatten_json 可以通过在终端中运行以下命令来安装。
pip install json-flatten
例子:
from flatten_json import flatten unflat_json = {'user' : {'Rachel': {'UserID':1717171717, 'Email': 'rachel1999@gmail.com', 'friends': ['John', 'Jeremy', 'Emily'] } } } flat_json = flatten(unflat_json) print(flat_json)
输出 :
{‘user_Rachel_UserID’: 1717171717, ‘user_Rachel_Email’: ‘rachel1999@gmail.com’, ‘user_Rachel_friends_0’: ‘John’, ‘user_Rachel_friends_1’: ‘Jeremy’, ‘user_Rachel_friends_2’: ‘Emily’}
json-flatten
库要慢一些。例子:
# for a array value of a key
unflat_json = {'user' :
{'Rachel':
{'UserID':1717171717,
'Email': 'rachel1999@gmail.com',
'friends': ['John', 'Jeremy', 'Emily']
}
}
}
# Function for flattening
# json
def flatten_json(y):
out = {}
def flatten(x, name =''):
# If the Nested key-value
# pair is of dict type
if type(x) is dict:
for a in x:
flatten(x[a], name + a + '_')
# If the Nested key-value
# pair is of list type
elif type(x) is list:
i = 0
for a in x:
flatten(a, name + str(i) + '_')
i += 1
else:
out[name[:-1]] = x
flatten(y)
return out
# Driver code
print(flatten_json(unflat_json))
输出 :
{‘user_Rachel_friends_2’: ‘Emily’, ‘user_Rachel_friends_0’: ‘John’, ‘user_Rachel_UserID’: 1717171717, ‘user_Rachel_Email’: ‘rachel1999@gmail.com’, ‘user_Rachel_friends_1’: ‘Jeremy’}