使用jq将外壳变量注入json对象

时间:2019-07-12 16:50:24

标签: json bash jq

我正在用jq拔头发。直到我尝试执行此操作之前,它对我使用过的每件事都有效。

我有一个完整的JSON对象,嵌套对象的深度各不相同。

这是一个简化的示例:

{
  "api": "blah/v1",
  "metadata": {
    "labels": {}
  }
}

此json是在go应用程序中解析的。

“标签”与go中的map [string] string对象相关。

我需要成对使用shell变量,并将它们注入此数据结构中。

遵循以下原则:

JSON=`echo ${JSON} | jq --arg $key KEY --arg $val VAL '.metadata.labels += { KEY: VAL }'`

我尝试使用--argjson,我尝试了单引号,双引号,转义等...都无济于事。我无法想象jq不能做这么简单的事情。我倾注了无数指南,但我只能找到一个例子,说明他们在作业的右侧使用变量,如下所示:

JSON=`echo ${JSON} | jq --arg $key KEY --arg $val VAL '.metadata.labels += { KEY: $VAL }'`

这可能是我本周已经工作了60个小时,直到今天才开始。但这使我难以理解。我需要花30秒钟才能完成的工作已经花了我一个小时的时间。

1 个答案:

答案 0 :(得分:1)

key=foo
val=bar
json='
{
  "api": "blah/v1",
  "metadata": {
    "labels": {}
  }
}
'

jq --arg key "$key" --arg val "$val" '.metadata.labels[$key] = $val' <<<"$json"

...正确发出作为输出:

{
  "api": "blah/v1",
  "metadata": {
    "labels": {
      "foo": "bar"
    }
  }
}