我想将列表转换为JSON数组。我正在查看jq
,但示例主要是解析JSON(不创建它)。知道正确的逃逸会很愉快。我的列表是单行元素,因此新行可能是最佳分隔符。
答案 0 :(得分:22)
我还试图将一堆行转换为JSON数组,并且处于停顿状态,直到我意识到-s
是我jq
一次只能处理多行的唯一方法jq -R -s -c 'split("\n")' < just_lines.txt
1}}表达式,即使这意味着我必须手动解析换行符。
-R
-s
阅读原始输入-c
将所有输入读作单个字符串jq
不能打印输出轻松自负。
编辑:我在split
≥1.4,这显然是在引入{{1}}内置时。
答案 1 :(得分:7)
您还可以使用jq -R .
将每一行格式化为JSON字符串,然后jq -s
(--slurp
)在将它们解析为JSON后为输入行创建数组:
$ printf %s\\n aa bb|jq -R .|jq -s .
[
"aa",
"bb"
]
如果输入以换行符结束,则chbrown的答案中的方法会在结尾添加一个空元素,但您可以使用printf %s "$(cat)"
删除尾随换行符:
$ printf %s\\n aa bb|jq -R -s 'split("\n")'
[
"aa",
"bb",
""
]
$ printf %s\\n aa bb|printf %s "$(cat)"|jq -R -s 'split("\n")'
[
"aa",
"bb"
]
如果输入行不包含ASCII控制字符(必须在有效JSON中的字符串中转义),则可以使用sed
:
$ printf %s\\n aa bb|sed 's/["\]/\\&/g;s/.*/"&"/;1s/^/[/;$s/$/]/;$!s/$/,/'
["aa",
"bb"]
答案 2 :(得分:3)
只是总结其他人所说的内容,希望能更快地理解形式:
cat /etc/hosts | jq --raw-input . | jq --slurp .
会回复你:
[
"fe00::0 ip6-localnet",
"ff00::0 ip6-mcastprefix",
"ff02::1 ip6-allnodes",
"ff02::2 ip6-allrouters"
]
<强>解释强>
--raw-input/-R:
Don´t parse the input as JSON. Instead, each line of text is passed
to the filter as a string. If combined with --slurp, then the
entire input is passed to the filter as a single long string.
--slurp/-s:
Instead of running the filter for each JSON object in the input,
read the entire input stream into a large array and run the filter
just once.
答案 3 :(得分:2)
我在jq的man页面中找到并通过实验在我看来是一个更简单的答案。
$ cat test_file.txt | jq -Rsc '. / "\n" - [""]'
["aa","bb"]
-R是在不尝试解析json的情况下读取,-s表示将所有输入读作一个字符串,而-c用于单行输出 - 不是必需的,但它是什么我在找。
然后在字符串中我传递给jq,&#39;。&#39;说按原样输入。 &#39; / \ n&#39;说要在换行符上划分字符串(拆分)。 &#39; - [&#34;&#34;]&#39;说从结果数组中删除任何空字符串(由最后一个额外的换行符产生)。
它是一行,没有任何复杂的结构,只使用简单的内置jq功能。
答案 4 :(得分:0)
更新:如果您的jq有library(ggplot2)
library(purrr)
species_list = unique(Iris$Species)
species_plot = function(x,y) {
ggplot(data = Iris,colour = Species, aes_string(x=x,y=y)) +
geom_point(shape = 21, aes(fill = Species),colour = "black", size =8)
}
species_bins = map(species_list, ~species_plot("sepal_length", "sepal_width") )
,您可以简单地写:
inputs
产生一个JSON字符串数组。