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)