python 利用jsonpath_ng库快速过滤json结构数据并增加key

需求:

在一个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的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值