Liunx上JSON处理工具jq
admin
2024-03-12 12:32:41

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.5https://blog.csdn.net/iamanda/article/details/122234695https://blog.csdn.net/whatday/article/details/125397561

相关内容

热门资讯

湖南的辣与江西的辣 在《“孪生兄弟”——湖南与江西?》一文中,我们一同“触摸”并感受了两地相似的山川脉络、江河湖泊与亭台...
这趟恩施之旅,见证了热情淳朴的... 恩施这片神奇的土地,用短短五天时间就在我心里刻下了无法磨灭的印记。那些云雾缭绕的山峰、清澈见底的溪流...
原创 湘... “桂林山水甲天下,阳朔山水甲桂林”一说,增加了我们到阳朔去的迫切期待。26日下午,我们终于坐上了从桂...
走起!去太行一号旅游公路五台山... 作图:宫可欣来源:五台山管委会
巡湘记荣登2025第九届中华餐... 2025年11月13日,上海新国际博览中心见证了餐饮界的一场盛会——“2025第22届中华餐饮双创论...