使用jq和命令行参数从JSON对象获取字段

时间:2019-03-08 09:31:52

标签: json bash jq

假设以下JSON文件

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

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

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

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

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

很遗憾,这没有得到预期的结果{"foo":"hello"}。 知道变量名为何进入对象吗?

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

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

很好,但是有一种方法可以使用手册页中说明的快捷方式语法,但是要使用变量?

  

您可以使用它来选择对象的特定字段:如果输入是具有“用户”,“标题”,“ id”和“内容”字段的对象,而您只想要“用户”和“标题” ,你可以写

     

{user: .user, title: .title}

     

因为这很普遍,所以有一种快捷语法:{user, title}

如果这很重要,我正在使用jq 1.5版

1 个答案:

答案 0 :(得分:1)

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

替代品

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

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

当然,还有其他一些警告提示:

myarg=foo ; jq "{ $myarg }"