基于JQ的表达式

 官方语法教程 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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值