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