使用 jq 从 JSON 输出中提取特定字段

Posted

技术标签:

【中文标题】使用 jq 从 JSON 输出中提取特定字段【英文标题】:Extract a specific field from JSON output using jq 【发布时间】:2017-01-06 19:09:18 【问题描述】:

我有一个 JSON 输出如下:


  "example": 
    "sub-example": [
      
        "name": "123-345",
        "tag" : 100
      ,
      
        "name": "234-456",
        "tag" : 100
      ,
      
        "name": "4a7-a07a5",
        "tag" : 100
      
    ]
  

我想提取三个“名称”字段的值,并将其存储在三个变量中。

我尝试cat json_file | jq '.["example.sub-example.name"]' 提取“名称”字段的值,但不起作用。

谁能告诉我如何使用 jq(或其他方法)来实现这一点?

【问题讨论】:

【参考方案1】:

如果您只想提取name 字段,您要查找的命令是jq '.example."sub-example" | .[] | .name'。如果要将名称保留在数组中,请将整个 jq 表达式括在方括号中。

【讨论】:

感谢您的建议。但是当我做猫测试时| jq '.example."子示例" | .[] | .name' 我收到错误:错误:语法错误,意外 QQSTRING_START,期待 IDENT .example。“子示例”| .[] | .name ^ 1 编译错误(^ 指向 jq '.example 后的点) 您使用的是最新版本的jq吗?它在我的系统上运行良好。我使用的是 1.5 版(您可以通过 jq --version 查询)。 它是 1.3(我通过 apt-get install jq 下载的)。有没有其他方法可以获取最新版本?我使用的是 Ubuntu 14.04 服务器。 如果我有一些字段“name-of-instance”而不是“name”,命令 jq '.example."sub-example" | .[] | .name-of-instance' 不起作用。你有什么建议可以解决吗? 那是因为它将.name-of-instance 解释为一个表达式(.name - of - instance)。使用引号,就像我在 "sub-example" 中所做的那样。【参考方案2】:

在 jq 1.3 中,您可以使用过滤器来提取值:

.example["sub-example"] | .[] | .name

或者更简洁:

.example["sub-example"][].name

这些当然也适用于更高版本的 jq。

读入shell变量

与其填充单独的 shell 变量(这需要事先知道有多少值),不如考虑填充一个 shell 数组。例如,使用带有mapfile(又名readarray)的bash shell:

mapfile -t ary < <(< json_file jq '.example."sub-example"[].name')

您也可以使用 shell while 循环。等等等等。关于这个主题有很多 SO Q。

【讨论】:

【参考方案3】:

已经有几年了,我最近不得不自己做这个,所以我想我应该在这里发布另一种方式。

您还可以使用map() 提取特定字段。例如

.example."sub-example"|map(.name)

参考:https://jqplay.org/s/N6TboUkELM

【讨论】:

以上是关于使用 jq 从 JSON 输出中提取特定字段的主要内容,如果未能解决你的问题,请参考以下文章

使用“jq”从 JSON 文件导出所需的输出(按正确顺序的字段)

使用 Python 从 Twitter 流 API 中提取特定的 JSON 字段

从 jq json 输出中排除列

使用'jq'[重复]从JSON输出中获取数据

Youtube-dl - 提取元数据/json 信息到文本文件

如何使用 jq 重新格式化 json 中的特定数据