循序渐进掌握json处理利器-jq

发布于:2025-05-12 ⋅ 阅读:(21) ⋅ 点赞:(0)

1.Overview

本文介绍了如何在 Ubuntu 中安装和使用 jq 工具,它是一个轻量级且灵活的命令行 JSON 处理器,广泛应用于处理 REST API 响应、k8S配置文件分析等场景。

2.安装

sudo apt update
sudo apt install jq

安装完成后,可通过以下命令验证版本:

jq --version

输出:

jq-1.7

3.基础数据筛选

3.1 格式化json

使用 jq ‘.’ 可以对原始 JSON 数据进行格式化,使其更易读。

echo '{"car":{"brand":"Toyota","model":"Corolla","price":20000}}' | jq '.'

输出:

{
  "car": {
    "brand": "Toyota",
    "model": "Corolla",
    "price": 20000
  }
}

也可以直接读取文件:

jq '.' car.json

调用外部 API 示例:

curl "https://timeapi.io/api/Time/current/zone?timeZone=Asia/Shanghai" | jq '.'

输出:

{
  "year": 2025,
  "month": 5,
  "day": 10,
  "hour": 17,
  "minute": 35,
  "seconds": 37,
  "milliSeconds": 285,
  "dateTime": "2025-05-10T17:35:37.2857712",
  "date": "05/10/2025",
  "time": "17:35",
  "timeZone": "Asia/Shanghai",
  "dayOfWeek": "Saturday",
  "dstActive": false
}

3.3 访问属性

通过“.”语法访问嵌套字段:

jq '.car' car.json

输出:

{
  "brand": "Toyota",
  "model": "Corolla",
  "price": 20000
}

访问更具体的字段:

jq '.car.model' car.json

输出:

"Corolla"

同时访问多个字段:

 jq '.car.brand,.car.model,.car.price' car.json

输出:

"Toyota"
"Corolla"
20000

键名包含空格时需加双引号:

echo '{ "with space": "hello" }' | jq '."with space"'

输出:

"hello"

4.JSON Arrays

4.1 Iteration(迭代)

数组可以通过 .[] 进行迭代:

echo '["Sun","Moon","Star"]'|jq '.[]'

输出:

"Sun"
"Moon"
"Star"

以下是更复杂的数组对象:

[
  {
    "brand": "Toyota",
    "model": "Corolla",
    "price": 20000
  },
  {
    "brand": "Honda",
    "model": "Civic",
    "price": 18000
  },
  {
    "brand": "Tesla",
    "model": "Model 3",
    "price": 35000
  }
]

提取所有品牌名称:
首先,我们使用 .[] 遍历数组。然后,我们可以使用管道符 | 将数组中的每个对象传递给命令中的下一个过滤器。最后一步是使用 .brand输出每个对象的 brand字段:

jq '.[]|.brand' cars.json

输出:

"Toyota"
"Honda"
"Tesla"

还可以使用稍微简洁一些的版本,直接访问数组中每个对象上的属性:
``bash
jq ‘.[].brand’ cars.json

输出:
```bash
"Toyota"
"Honda"
"Tesla"

4.2 透过索引访问

可以通过索引获取数组中特定元素的字段:

 jq '.[1].price' cars.json

输出:

18000

4.3 slicing(切片)

支持切片语法:

echo '[1,2,3,4,5,6,7,8,9,10]' | jq '.[6:9]'

输出:

[
  7,
  8,
  9
]

结合使用多次切片:

echo '[1,2,3,4,5,6,7,8,9,10]' | jq '.[:6]' |jq '.[-2:]'

输出:

[
  5,
  6
]

[:6]等价[0:6],将取出1,2,3,4,
[-2]意思是从数组倒数第二个元素开始到数组末尾的所有元素

5.使用函數

有时,我们可能希望获取一个对象的键组成的数组,而不是它的值。

5.1 获取键名

可使用 keys 获取对象的所有键名:

 jq '.car|keys' car.json

输出:

[
  "brand",
  "model",
  "price"
]

5.2 获取长度

另一个用于数组和对象的实用函数是 length 函数。
我们可以使用这个函数来返回数组的长度,或对象上属性的数量:

jq '.car | length' car.json

输出:

3

还可以对字符串值使用长度函数:

jq '.car.model | length' car.json

输出:

7

5.3 映射值

在 jq 中,map() 是一个常用的函数,它的作用是 对数组中的每个元素应用 ()内的操作,并返回一个新数组。简单来说,map() 会遍历数组中的每个元素,然后对每个元素执行相同的操作,最后将结果收集成一个新的数组。

检查 car.json 文件中的每个元素是否都包含 “model” 这个键,并返回一个布尔值数组,表示每个元素是否有该键。

jq 'map(has("model"))' car.json

输出:

true
  • map(…):对数组的每个元素应用括号内的表达式。
  • has(“model”):检查每个对象是否包含 “model” 这个键,返回 true 或 false。

加法操作:

jq 'map(.price+2)' car.json

输出:

[
  20002
]

5.4 Min与Max

如果我们需要找到输入数组的最小或最大元素,我们可以利用 min 和 max 函数
min操作:

jq '[.[].price]|min ' cars.json

输出:

18000

max操作:

 jq '[.[].price]|max' cars.json

输出:

35000

5.5 筛选值

条件筛选:

 jq '.[]| select(.price>20000)' cars.json

输出:

{
  "brand": "Tesla",
  "model": "Model 3",
  "price": 35000
}

匹配特定值:

jq '.[]| select(.model=="Civic")' cars.json

输出:

{
  "brand": "Honda",
  "model": "Civic",
  "price": 18000
}

复合条件:

jq '.[]| select(.model=="Civic" and .price >= 18000)' cars.json

输出:

{
  "brand": "Honda",
  "model": "Civic",
  "price": 18000
}

通过键名前缀筛选:

 jq '.[]|to_entries[]|select(.key|startswith("brand")).value' cars.json

输出:

"Toyota"
"Honda"
"Tesla"

5.6 使用正则表达式

支持用 test() 匹配正则表达式:

jq '.[]|select(.brand|test("^H"))' cars.json

输出:

{
  "brand": "Honda",
  "model": "Civic",
  "price": 18000
}

5.7 查找唯一值

提取不重复的字段值:

jq 'map(.model)|unique' cars.json

5.8 从 JSON 中删除key

使用 del 删除字段:

 jq 'del(.car.brand)' car.json

输出:

{
  "car": {
    "model": "Corolla",
    "price": 20000
  }
}

6. 转换Json

在处理嵌套 JSON 时,我们常常只关心其中的部分字段。下面是一个典型例子,演示如何从嵌套结构中提取每本书的标题和摘要,并生成一个简洁的数组:
示例数据(books.json):

{
  "library": {
    "books": [
      {
        "bk101": {
          "id": "bk101",
          "title": "XML Developer's Guide",
          "summary": "An in-depth look at creating applications with XML."
        }
      },
      {
        "bk102": {
          "id": "bk102",
          "title": "Midnight Rain",
          "summary": "A former architect battles corporate zombies, an evil sorceress, and her own childhood."
        }
      }
    ]
  }
}

提取命令:

jq '.library.books|[.[]|map(.)|.[]|{book_title:.title,book_summary:.summary}]' books.json

输出:

[
  {
    "book_title": "XML Developer's Guide",
    "book_summary": "An in-depth look at creating applications with XML."
  },
  {
    "book_title": "Midnight Rain",
    "book_summary": "A former architect battles corporate zombies, an evil sorceress, and her own childhood."
  }
]

7.总结

本文系统介绍了如何在 Ubuntu 系统中安装并使用 jq 工具对 JSON 数据进行高效处理。我们从基础的格式化展示和属性访问入手,逐步扩展到数组遍历、索引访问、切片操作,以及应用 jq 提供的各种函数进行键名提取、长度计算、映射处理、值筛选、正则匹配、唯一值提取和键删除等高级功能。通过配套的实际命令与输出示例,读者可以快速掌握 jq 的核心用法,灵活应对日常 JSON 数据的读取、查询与变换任务。

jq 是处理结构化数据时非常有力的工具,特别适合在命令行环境中对 API 返回值、日志、配置文件等进行快速分析与操作。建议在实际工作中多加练习,熟悉其过滤器与函数组合的使用方式,充分发挥其强大的文本处理能力。