基于JQ的表达式

 官方语法教程 https://jqlang.github.io/jq/manual/

jq是一个灵活性极强的json处理库,支持丰富的表达式,对于多数据适配场景来说具有很大作用

 *  jq表达式由如下组成:
 *      . 导航 -- eg.  .name 则取name字段的值 . 则代表自己 多个使用代表下级属性 (.name.firstname)
 *      [] 数组 -- eg. .names[] 代表取出来的是一个数组(已遍历的)
 *          数组可以支持截取.names[:] 截取第几个到第几个,此处与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 result = q.apply(in);
System.out.println(result);

你可能感兴趣的:(windows,JQ)