用 jq 从 JSON 里取出字段:过滤器怎么写、怎么确认

准备工作

  • 安装 jq(如 brew install jq),jq --version 有输出。

  • 步骤依据 jq 1.8 Manual,核实日期 2026-10-24;其他小版本过滤器大多兼容。[1]

  • 准备样例:echo '{"user":{"name":"Ada","age":36},"tags":["a","b"]}' > /tmp/demo.json

操作步骤

1、取出顶层对象里的嵌套字段

做什么:jq '.user.name' /tmp/demo.json

为什么:jq 程序是过滤器:输入 JSON,输出结果。手册 Basic filters 说明 .foo 取字段。[1]

怎么确认:stdout 打印 "Ada"(带引号的 JSON 字符串);退出码 0。

2、构造新对象

做什么:jq '{n:.user.name, t:.tags[0]}' /tmp/demo.json

为什么:可以用对象构造式挑选字段,便于把接口响应收成自己要的形状。手册在 Types and Values / 构造相关章节说明对象与数组字面量。[1]

怎么确认:输出类似 {"n":"Ada","t":"a"};字段名与值符合表达式。

3、对数组做 map

做什么:jq '.tags | map(ascii_upcase)' /tmp/demo.json

为什么:管道把前一步输出送入下一过滤器;map 对数组每个元素应用表达式。手册 Builtin operators and functions 覆盖 map 等。[1]

怎么确认:得到 ["A","B"];若 tags 不是数组会报类型错误——这是预期,用于发现数据结构假设错了。

4、从文件与 stdin 两种方式跑同一过滤

做什么:cat /tmp/demo.json | jq '.user.age'

为什么:手册 Invoking jq 说明可从 stdin 读入,方便接 curl。[1]

怎么确认:输出 36;与直接 jq '.user.age' /tmp/demo.json 一致。

注意事项

  • 壳层会吃引号:复杂过滤器建议用单引号包住 jq 程序。

  • 大数据用流式选项前先读手册 Streaming,避免一次性吃爆内存。

来源

[1] jq Manual · https://jqlang.github.io/jq/manual/ · 核实于 2026-10-24

#jq #JSON #命令行 #教程 #前端