Json
文章目录
schema 规范
相关工具
过滤工具
JsonPath
JMESPath
参考:
特点: json 过滤器,library, 有 python 和 php 等语言对应的包
优势:
- python 支持友好
jq
命令行工具
保存工具
jsonl – jsonlines
参考:
jq 语法
参考:
命令使用方法:
jq 'your expression /path/to/your_json_file'
例子:
- 第一个表达式需要是
.: 表示获得整个 json [{"k": "v"}, {"k1": "v1"}]:取得第 0 个dict:
.[0]{"k": "v"}取得所有 dict:
.[]{"k": "v"} {"k1": "v1"}取得所有 dict, 并制作成一个list:
[.[]]1 2 3 4 5 6 7 8[ { "k": "v" }, { "k1": "v1" } ]取得第0个dict 中的value:
.[0].k或.[0]."k"或.[0]["k"]1 2 3 4 5 6 7 8 9 10❯ echo '[{"k": "v"}, {"k1": "v1"}]' | jq '.[0].k' "v" ❯ echo '[{"k": "v"}, {"k1": "v1"}]' | jq '.[0]."k"' "v" ❯ echo '[{"k": "v"}, {"k1": "v1"}]' | jq '.[0].["k"]' jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1: .[0].["k"] jq: 1 compile error ❯ echo '[{"k": "v"}, {"k1": "v1"}]' | jq '.[0]["k"]' "v"- 注意:
["k"]这种使用 key 获得 value 的方法需要取消前面的.号
- 注意:
{"k": [1, 2, 3]}
取得value 中的 第 0 个 value:
.k[0]1 2❯ echo '{"k": [1, 2, 3]}' |jq '.k[0]' 1
jmspath
使用
参考:
- JMESPath Tutorial — JMESPath
- 数组 index:
[12] dict key:
key_name- 单个:
key_name - 多级(只有 dict 嵌套):
k1.k2.k3
- 单个:
dict + array 嵌套:
arr_name[index_num]- arr_name 是 key 名称
- index_num 是特定 array 中的元素
切片
- 对于数组 array 支持类似 python list 的切片
- eg:
arr[1:3]
Projection(糢糊匹配),使用通配符"*"
数组,糢糊匹配:
arr[*]- arr 数组下的所有元素
dict, 糢糊匹配:
key_name.*- key_name 下嵌套字典的所有元素
Flattern Projection(展开), 运算符"[]"
- 嵌套结构被展开一层
eg: "running", "stopped"], ["terminated", "running" –> ["running", "stopped", "terminated", "running"]
注意:
- 前者是 [*] 匹配结果,保持了嵌套层级
- 后者是 [] 匹配结果,展开了一层嵌套
- 展开两级,使用
[][]
Filter Projections(过滤)
类似 linux pipe, 运算符 "|"
- 传递处理结果给,下一个表达式,eg:
people[*].first | [0]
- 传递处理结果给,下一个表达式,eg:
多选,运算符","
- eg:
people[].[name, state.name]
- eg:
函数
- 参考: JMESPath Function Specification — JMESPath
- eg:
myarray[?contains(@, 'foo') == `true`]
| |
自定义类的 json 化
实现方法:
- 通过 json.dumps(obj, default=your_convert_fun), 传入你的自定义函数,把给定的对象 obj 转换成可以 json 化的 python 对象
| |
NaN 的 json 化
- json 不会把普通数据中的 float('nan') 转换成 None, 需要 做前处理
文章作者
上次更新 2025-09-24 (360d44c)