官方语法教程 https://jqlang.github.io/jq/manual/
jq是一个灵活性极强的json处理库,支持丰富的表达式,对于多数据适配场景来说具有很大作用
* jq表达式由如下组成:
* . 导航 -- eg. .name 则取name字段的值 . 则代表自己 多个使用代表下级属性 (.name.firstname)
* [] 数组 -- eg. .names[] 代表取出来的是一个数组(已遍历的)
* 数组可以支持截取.names[<number>:<number>] 截取第几个到第几个,此处与python语法一致
* , 连接 -- 取出多个属性,eg. .name,.age
* | 管道符 -- 向下遍历 与普通linux命令 | 意义一致 eg. .name|.firstname访问姓名下的姓 .peoples[]|.name访问peoples下所有人的姓名
* {} 生成json对象 -- eg. {“dogeName“:.name}当前结果 将 原json的name字段赋值到dogeName
* [] 生成json数组 -- 与json对象一致
* .. 所有key -- eg. {“people“:{“mask“:{“name“:“AA“}},{“tony“:{“name“:“BB“}}} 此时访问 ..name,则为 AA,BB
* del 删除某个key -- eg. del(.mask)
* 条件判断 if ... then ...else ...end
* 除以上外还支持很多其他函数或逻辑,包含 循环、has、长度判断 数学函数计算 等 可到官网学习
linux demo
简单的提取
echo '{"foo": 42,"bar": "less interesting data"}' | jq '.foo,.bar'
此处获取了 foo与bar两个字段的值
将json中的字段进行重命名
echo '{"foo": 42,"bar": "less interesting data"}' | jq '{"name":.foo,"desc":.bar}'
取出foo和bar字段,分别放到 name 和 desc字段上
将json中的list截取出来,并重命名list中的对象key
echo '{"sources":[{"id":1,"kind":"widget","events":"001"},{"id":2,"kind":"widget","events":"002"}]}' |jq '{"list":[(.sources[] | .pid =.id |del(.id))]}'
此处,我们声明了一个list,值为申明式数组,数据数据来源 表达式为:.sources[] | .pid =.id |del(.id)。意思是 遍历sources --- 将id赋值给pid ---删除id
带有判断条件的 json截取
echo '{"sources":[{"id":1,"kind":"widget","events":"001"},{"id":2,"kind":"widget","events":"002"}]}' |.\jq-win64.exe '{"list":[(.sources[] | if .id==1 then .pid =.id else empty end |del(.id))]}'
该表达式中 增加了 if .id==1 then .pid =.id else empty end 当id为1时,才进行处理,否则将将该元素置空
windows与 cmd 与powershell略有不同
cmd 中无需外部 引号,powershell则需要引号,无需echo
如通过java调用 已经有了 jackson-jq.jar ,直接使用即可:
ObjectMapper MAPPER = new ObjectMapper();
String json="{\"foo\": 42,\"bar\": \"less interesting data\"}";
String express="{\"name\":.foo,\"desc\":.bar}";
JsonQuery q = JsonQuery.compile(express);
JsonNode in = MAPPER.readTree(json);
System.out.println(in);
List<JsonNode> result = q.apply(in);
System.out.println(result);