jq& bash:从变量中生成JSON数组

时间:2014-03-16 07:42:10

标签: arrays json bash jq

我使用jq在变量值的bash中形成JSON。

如何制作普通变量

$ VAR="one two three"
$ jq -n "{var:\"$VAR\"}"
{
  "var": "one two three"
}

但是还不能制造阵列。我有

$ echo $ARR
one
two
three

并希望获得类似

的内容
{
  "arr": ["one", "two", "three"]
}

我只能设置像

这样的乱码输出
$ jq -n "{arr: [\"$ARR\"]}"
{
  "arr": [
    "one\ntwo\nthree"
  ]
}

如何以正确的方式形成JSON数组? jq能做到吗?

编辑:当只有jq 1.3时询问了问题。现在,在jq 1.4中,我可以直接按照我要求的那样做,比如@JeffMercado和@peak建议,为他们提供支持。但是,不要忘记接受@jbr的答案。

7 个答案:

答案 0 :(得分:22)

在jq 1.3及更高版本中,您可以使用--arg VARIABLE VALUE命令行选项:

jq -n --arg v "$VAR" '{"foo": $v}'

即,--arg将变量设置为给定值,这样您就可以在jq程序中使用$varname,现在您不必在jq程序中使用shell变量插值。 / p>

编辑:从jq 1.5及以上版本,您可以使用--argjson直接传入数组,例如

jq -n --argjson v '[1,2,3]' '{"foo": $v}'

答案 1 :(得分:13)

加载变量后,应使用split过滤器将该字符串拆分为数组。

$ jq -n --arg inarr "${ARR}" '{ arr: $inarr | split("\n") }'

答案 2 :(得分:7)

此主题中的原始帖子提到VAR =“一二三”。对于这样的变量,jq 1.4中的一个非常简单的解决方案如下:

$ jq -n -c -M --arg s "$VAR" '{var: ($s|split(" "))}'
{"var":["one","two","three"]}

(这假定是Linux或Mac shell或类似的,并且适用于jq 1.4。)

如果分隔符是换行符,请考虑这个打字稿:

$ s=$(printf "a\nb\nc\n")
$ jq -n -c -M --arg var "$s" '{"var": ($var|split("\n"))}'
{"var":["a","b","c"]}

请注意换行符的JSON字符串为"\n"(不是"\\n")。

感兴趣的第三种情况是VAR是一个bash数组。在这种情况下,使用“$ {VAR [@]}”传递项目是可以接受的,但一般来说,必须记住“--arg name value”选项仅用于传入字符串。

在jq> 1.4中,可以使用“env”对象传入导出的shell变量,如在线jq手册页中所述。

答案 3 :(得分:3)

首先,您必须使用-R来阅读原始行,然后您必须使用-s来覆盖所有值:

$ echo -e "one\ntwo\nthree" | jq -R . | jq -s '{"arr": .}'
{
  "arr": [
    "one",
    "two",
    "three"
  ]
}

答案 4 :(得分:2)

jq正在按照你的要求去做。 jq不是用于生成JSON的程序,而是用于查询它的工具。您使用-n开关所做的只是将它用作漂亮的打印机。因此,如果您希望它打印一个包含"一个",&#34的数组的对象;两个","三个"然后你必须生成它。

VAR="one two three"
VAR=$(echo $VAR | sed -e 's/\(\w*\)/,"\1"/g' | cut -d , -f 2-)
echo "{var: [$VAR]}"

<强>更新

正如Bryan和其他人在下面提到的那样,确实可以使用jq生成JSON,并且从版本1.4开始,它甚至可以直接执行OP所要求的内容,例如参见{{3} }。

答案 5 :(得分:2)

这在jq 1.6中对我有用:

$ jq -nc '$ARGS.positional' --args 1 2 3
["1","2","3"]

对于此特定用例,您可以使用数组并编写:

$ VAR=(one two three)
$ jq -nc '{var: $ARGS.positional}' --args ${VAR[@]}
{"var":["one","two","three"]}

您还可以使用这样的字符串:

$ VAR="one two three"
$ jq -nc '{var: ($ARGS.positional[0] | split(" "))}' --args $VAR

答案 6 :(得分:0)

您可以使用以下语法:

jq --arg keyName "MyVal" '.[]."\($keyName)"[] ./JSONFile.js

用于输入数据,如

[{"MyVal":"Value1","MyVal":Value2,"NotMyVal":"Value3"}];

使用变量从JSON获取解析数据。

此示例将打印:

"Value1"
"Value2"