Python 处理json文件

JSON 基本介绍

1 JSON 内置库

适用内置库实现 json 的基本操作

import json

food_ratings = {"organic dog food": 2, "human food": 10}
json.dumps(food_ratings) # 将 Python 字典转换为 JSON 对象
# '{"organic dog food": 2, "human food": 10}'

json.loads(json.dumps(food_ratings)) # JSON 转字典

available_nums = {(1, 2): True, 3: False}
json.dumps(available_nums, skipkeys=True) # 过滤不支持的类型
# '{"3": false}'

toy_conditions = {"chew bone": 7, "ball": 3, "sock": -1}
json.dumps(toy_conditions, sort_keys=True) # 对字典键进行排序
# '{"ball": 3, "chew bone": 7, "sock": -1}'

with open("food_ratings.json", mode="w", encoding="utf-8") as write_file:
    json.dump(food_ratings, write_file) # 存储JSON文件

with open("hello_frieda.json", mode="r", encoding="utf-8") as read_file:
    frie_data = json.load(read_file # 读取JSON文件

print(json.dumps(food_ratings, indent=2)) # 美化格式,缩进2字符

2 orjson 最快的 JSON 读写库

项目地址 5.9k ⭐️

安装:

pip install --upgrade "pip>=20.3" # manylinux_x_y, universal2 wheel support
pip install --upgrade orjson

代码示例:

import orjson, datetime, numpy
data = {
    "type": "job",
    "created_at": datetime.datetime(1970, 1, 1),
    "status": "ok",
    "payload": numpy.array([[1, 2], [3, 4]]),
}
# 序列化
orjson.dumps(data, option=orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY)
# b'{"type":"job","created_at":"1970-01-01T00:00:00+00:00",
# "status":"\xf0\x9f\x86\x97","payload":[[1,2],[3,4]]}'
# 反序列化
orjson.loads(_)
# {'type': 'job', 'created_at': '1970-01-01T00:00:00+00:00', 
# 'status': 'ok', 'payload': [[1, 2], [3, 4]]}

常用配置项:

  • OPT_INDENT_2:JSON 结果添加 2 个空格的缩进
  • OPT_OMIT_MICROSECONDS:自动转化为日期时间对象为做饭吃
  • OPT_NON_STR_KEYS:强制将数值型键转换为字符型
  • OPT_SERIALIZE_NUMPY:兼容复杂的 pandas 数据结构对象
  • OPT_SERIALIZE_UUID:兼容 UUID 对象
  • OPT_SORT_KEYS:JSON 结果按照键进行排序

3 JSONPath 解析处理 JSON 对象

JSONPath 也是用于从 json 数据中按照层次规则抽取数据的一种实用工具,在 Python 中可以使用 jsonpath 这个库来实现 JSONPath 的功能

项目地址 564⭐️

安装:pip install --upgrade jsonpath-ng

JSONPath 语法:

功能 语法
根节点 $
当前节点 @
子节点 .或[]
任意子节点 *
任意后代节点 ..

代码示例:查询/过滤/增删改

import json
from jsonpath import jsonpath

# 读入示例json数据
with open('json示例.json', encoding='utf-8') as j:
    demo_json = json.loads(j.read())

# 提取所有duration键对应值
jsonpath(demo_json, '$..duration')

# 提取所有steps键的子节点对应instruction值
jsonpath(demo_json, '$..steps.*.instruction')

# 多选所有steps键的子节点对应的instruction与action值
jsonpath(demo_json, '$..steps.*[instruction,action]')

# 选择steps键的第1到3(不包括3)个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[1:3][instruction,action]')

# 配合@,选择steps键的最后一个子节点对应的instruction与action值
jsonpath(demo_json, '$..steps[(@.length-1)][instruction,action]')

# 找到所有steps子节点中orientation为“西”的
jsonpath(demo_json, '$..steps[?(@.orientation == "西")]')

# 在duration键下增加名new_value的子节点
parser('$..duration.new_value').find_or_create( demo_json)

# 过滤所有duration键为 999 的节点
parser('$..duration').filter(lambda x: x == 999, demo_json)

# 更新所有duration键对应值为100
parser('$..duration').update(demo_json, 100)

# 更新所有steps键的子节点对应instruction值为200
parser('$..steps.*.instruction').update_or_create(demo_json, 200)

参考

在 Python 中操纵 json 数据的最佳方式
Python 中 JSON 结构数据的高效增删改操作

往年同期文章