首页 > 解决方案 > 使用 jq 和命令行参数从 JSON 对象中获取字段

问题描述

假设以下 JSON 文件

{ 
   "foo": "hello",
   "bar": "world"
}

我想foo从独立对象中的 JSON 对象中获取字段,我这样做:

<file jq '{foo}'
{
   "foo": "hello"
}

现在我真正想要的字段来自 shell,并jq作为这样的参数给出:

<file jq --arg myarg "foo" '{$myarg}'
{
   "myarg": "foo"
}

不幸的是,这并没有给出预期的结果{"foo":"hello"}。知道为什么变量的名称会进入对象吗?

解决方法是显式定义对象:

<file jq '{($myarg):.[$myarg]}'

很好,但是有没有办法使用手册页中解释的快捷语法,但是有一个变量?

您可以使用它来选择对象的特定字段:如果输入是具有“user”、“title”、“id”和“content”字段的对象,而您只需要“user”和“title”,则可以写

{user: .user, title: .title}

因为这很常见,所以有一个快捷语法:{user, title}.

如果这很重要,我使用的是 jq 1.5 版

标签: jsonbashjq

解决方案


简而言之,没有。快捷语法只能在非常特殊的条件下使用。例如,它不能与 jq关键字的键名一起使用。

备择方案

Q 中描述的方法是首选方法,但为了记录,这里有两种选择:

jq --arg myarg "foo" '
  .[$myarg] as $v | {} | .[$myarg] = $v'

当然,还有许多警告的替代方案:

myarg=foo ; jq "{ $myarg }"

推荐阅读