首页 > 解决方案 > 使用 jq 向动态键添加值

问题描述

我尝试用 jq 构造一个 json 对象。我从一个空对象开始,想要动态添加键和值。

这有效,但关键是不可变的。它固定为“foo”:

echo '{"foo": ["baz"]}' | jq --arg value "bar" '.foo += [$value]'

按预期输出:

{"foo": ["baz", "bar"]}

我真正想做的是这样的:

echo '{"foo": ["baz"]}' | jq --arg key "foo" --arg value "bar" '.($key) += [$value]'

不幸的是,这不起作用。这是输出:

jq: error: syntax error, unexpected '(' (Unix shell quoting issues?) at <top-level>, line 1:

.($key) += [$value]

jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1:

.($key) += [$value]

jq: 2 compile errors

我找不到解决方案或弄清楚。

我知道这行得通:jq --null-input --arg key foo '{($key): "bar"}'但这并不能解决我的问题,因为我想将值附加到现有列表中,如您在示例中所见。

标签: jsonjq

解决方案


您需要使用方括号[..]而不是(..)错误消息中报告的那样。做就是了

jq --arg key "foo" --arg value "bar" '.[$key] += [$value]'

这个错误行非常冗长,向您推荐正确的语法。重点#是我的

jq: error: try .["field"] instead of .field for unusually named fields at <top-level>, line 1
#              ^^^^^^^^^^^^^  

推荐阅读