• Liunx上JSON处理工具jq


    jq处理json字符串

    一、概述

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

    二、调用jq

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

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

      cat a.json | jq
      
      #打印输出--------------
      {
        "use_name": "xiaoMing",
        "age": 12,
        "sex": "男"
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • -S,顺序输出

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

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

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

      jq  keys[] a.json
      # 打印输出--------------
      "age"
      "sex"
      "use_name"
      
      
      # 加上-r 效果
      jq  -r keys[] a.json
      age
      sex
      use_name
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

    三、基本过滤器

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

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

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

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

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

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

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

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

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

    四、数组构造

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

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

    获取索引为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}
      
      • 1
      • 2
      • 3
      • 4

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

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

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

      # 输入
      {"user":"stedolan","titles":["JQ Primer", "More JQ"]}
      
      # 命令
      jq  {user, title: .titles[]}
      
      # 输出
      {"user":"stedolan", "title": "JQ Primer"}
      {"user":"stedolan", "title": "More JQ"}
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

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

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

    • key上使用表达式

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

      # 输入
      {"user":"stedolan","titles":["JQ Primer", "More JQ"]}
      
      # 命令
      {(.user): .titles}
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    参考文献

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    【C++】内存管理
    LeetCode50天刷题计划(Day 13—— 四树之和(8.50-10.00)
    SequoiaDB湖仓一体分布式数据库2022.11月刊
    C和指针 第14章 预处理器 14.4 文件包含
    C语言 字符函数汇总,模拟实现各字符函数(炒鸡详细)
    nginx的安装及使用
    MySQL数据库表的增删查改
    Linux内核分析(十六)--内存管理之管理机制
    全网最细,真实企业性能测试落地实施,一文带你快速打通...
    同花顺后端工程师一面面试经验
  • 原文地址:https://blog.csdn.net/qq_39381892/article/details/128147419