Liunx上JSON处理工具jq

jq处理json字符串

一、概述

jq是一个Liunx系统上针对JSON处理的工具,它接收一个输入,然后生成一个输出。有许多内置过滤器用来提取对象的特定字段,或者将数字转为字符串,或者执行各种其他的标准任务。

二、调用jq

可以使用命令行选项来影响jq如何读写输入和输出,有很多,这里只选择几个自认为常用的,下面的示例用将会以该json字符示例

# a.jsoncat
{"use_name": "xiaoMing","age": 12,"sex":"男"}
  • json格式查看

    cat a.json | jq
    
    #打印输出--------------
    {
      "use_name": "xiaoMing",
      "age": 12,
      "sex": "男"
    }
    
  • -S,顺序输出

    将json的各个字段按照key排序输出

    cat a.json | jq -S
    # 打印输出--------------
    {
      "age": 12,
      "sex": "男",
      "use_name": "xiaoMing"
    }
    
  • -r,去掉双引号输出

    使用该命令,如果过滤器的结果是string,将会以标准输出,而不是 字符串的格式输出,该示例是获取json里的所有key

    jq  keys[] a.json
    # 打印输出--------------
    "age"
    "sex"
    "use_name"
    
    
    # 加上-r 效果
    jq  -r keys[] a.json
    age
    sex
    use_name
    

三、基本过滤器

  • .(点),最常用的过滤器,

    一个JSON像map一样,键值对的形式存在,.age 即代表获取age对应的值,如果不存在则返回null

    jq .age
    # 打印输出--------------
    12
    
  • [i] 通过索引访问元素,当JSON是数组对象时,可以使用索引下标的形式访问元素

    jq '.[0]'
    --------------------
    Input   [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
    Output  {"name":"JSON", "good":true}
    

    i为负索引也是可以的,-1代表最后一个元素,-2代表倒数第二个元素。
    .[] 则返回所有元素

    给定一个索引范围返回元素,[2,4] 返回数组长度为3,包含了从2(包含)到4(不包含)的元素

    jq '.[2:4]'
    --------------------
    Input   ["a","b","c","d","e"]
    Output  ["c", "d"]
    
    jq '.[:3]'
    --------------------
    Input   ["a","b","c","d","e"]
    Output  ["a", "b", "c"]
    
    jq '.[-2]'
    --------------------
    Input   [1,2,3]
    Output  2
    
  • | 管道,和Liunx的用法一样,将左边的结果,再拿到右边执行

    jq '.[1] | .name'
    --------------------
    Input   [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
    Output  “XML”
    

    先获取索引为1的元素,再获name属性值

四、数组构造

[] 可以用来构造数组,如[1,2,3] ,jq也可以用来输出一个数组。它是使用表达式将产生的结果收集到一个大数组里,用 隔开每个元素表达式

jq '[.[0].name , .[1].goods]'
--------------------
Input   [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
Output  ["JSON", false]

获取索引为0的元素的name属性 和 索引为1的元素的good的属性

五、对象构造{}

构建一个json对象,又叫字典或者哈希,如{"a":23,"b":23}。如果key由所有字母字符组成,在构建过程中引号可以省略。Value可以是任何复杂的表达式

  • 基本构建

    从两个对象取几个字段重新构建成一个json对象

    jq '{name: .name , age: .age}'
    
    Input   {"name":"JSON", "good":true,"age":34}
    Output  {name: "JSON" , age: 34}
    

    由于使用频繁,所以有一个快捷语法

    jq '{name, age}'
    
  • value表达式返回多个值

    如果其中的一个表达式生成多个结果,那么返回的对象将会多个,例如:

    # 输入
    {"user":"stedolan","titles":["JQ Primer", "More JQ"]}
    
    # 命令
    jq  {user, title: .titles[]}
    
    # 输出
    {"user":"stedolan", "title": "JQ Primer"}
    {"user":"stedolan", "title": "More JQ"}
    
    
    

    如果是想title里也想输出数组的话,则使用

    {user,tie:.titles}
    要怎么理解这种用法,.titles[] 已经声明了这是个数组,.titles 则代表的是一个对象,只是这个对象是个数组。

  • key上使用表达式

    刚才说过,在定义key的时候,双引号可以省略掉,那么如果key上也想使用表达式,则使用() 括号包裹,例如:

    # 输入
    {"user":"stedolan","titles":["JQ Primer", "More JQ"]}
    
    # 命令
    {(.user): .titles}
    
    

参考文献

https://stedolan.github.io/jq/manual/
# 中文文档
https://github.com/alingse/jq-manual-cn/tree/master/manual/v1.5

https://blog.csdn.net/iamanda/article/details/122234695

https://blog.csdn.net/whatday/article/details/125397561
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值