需求:
在一个json结构的数据中,按要求添加key和值。例如,在一个表示学校人员信息的json中,给所有学生添加id,具体json见下:
代码:
# -*- coding: utf-8 -*-
import jsonpath_ng
demo_json = {
'type': 'School',
'body': [
{
'type': 'Student',
'name': 'Alice',
'age': 16
},
{
'type': 'Student',
'name': 'Bob',
'age': 18
},
{
'type': 'Teacher',
'name': 'Carol',
'age': 50
}
]
}
parser = jsonpath_ng.parse('$..type')
matches = parser.find_or_create(demo_json)
student_id_index = 0
for match in matches:
# 根据条件过滤匹配到的节点
if match.value == 'Student':
fp = match.full_path
fp.right.fields = ('student_id', ) # 把原path替换为自己想创建的path,具体是fp.right.fields还是fp.fields可以自己debug看
fp.update_or_create(demo_json, student_id_index) # 按照新path 更新原json 达到添加key的效果
student_id_index += 1
print(demo_json)
结果:
{
'type': 'School',
'body': [
{
'type': 'Student',
'name': 'Alice',
'age': 16,
'student_id': 0
},
{
'type': 'Student',
'name': 'Bob',
'age': 18,
'student_id': 1
},
{
'type': 'Teacher',
'name': 'Carol',
'age': 50
}
]
}
分析:
jsonpath-ng可以利用jsonpath语法操纵json数据。这里首先是利用type这个key查找数据,利用type的值来过滤出学生,然后获取match.full_path,并在此基础上构建一个在原json中“不存在”的path,最后用update_or_create来根据path更新对应json中的数据,以达到添加key的效果。