![如何使用jq将命令行中的bash数组转换为json数组?](https://linux22.com/image/214611/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8jq%E5%B0%86%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%AD%E7%9A%84bash%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BAjson%E6%95%B0%E7%BB%84%EF%BC%9F%20.png)
$ jq -c -n -e '[$x, $y]' --argjson x '"a"' --argjson y '"b"'
["a","b"]
我知道我可以做上面这样的事情。如果我想从 bash 数组生成一个 json 数组,如下所示。有没有办法用任意长度的参数来做到这一点?
$ jq {some jq arguments} a b c # the bash array can be of an arbitrary length.
["a","b","c"]
注意 a、b、c 没有在命令行中引用,因为我希望输入简单。
答案1
有两种主要方法可以从任意字符串列表创建有效的 JSON 数组。一种是使用jq
它的--args
选项:
jq -c -n '$ARGS.positional' --args "${mylist[@]}"
或者,如果元素不被编码为字符串(例如,它们可以是纯数字,或者之前准备好的 JSON 字符串或整个 JSON 对象),
jq -c -n '$ARGS.positional' --jsonargs "${mylist[@]}"
请注意,--args
and--jsonargs
及其参数必须是 命令行上的最后一个内容jq
。
我正在使用-n
禁用读取任何外部输入并-c
以“紧凑”输出格式创建 JSON,如问题所示。
另一种方法是使用jo
,这是一个专门为在命令行上轻松生成 JSON 而设计的工具:
jo -a "${mylist[@]}"
-a
从jo
给定参数生成数组的选项。
该jo
工具推断对象本身的类型,因此像这样的列表
mylist=(1 2 3 4 5 b)
将被转换成 JSON 数组
[1,2,3,4,5,"b"]