我的文件有N个JSON对象,用逗号(,)
分隔{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2} ...
我想使用jq
[{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2} ...]
我试过jq -R 'split(",")' myfile.json
,但它给了我一个N字符串数组
[
"{\"a\":1}",
"{\"b\":2}",
"{\"a\":1}",
"{\"b\":2}",
"{\"a\":1}",
"{\"b\":2}",
"{\"a\":1}",
"{\"b\":2}" ....
]
有什么想法吗?
答案 0 :(得分:1)
您走在正确的轨道上,您只需要将fromjson
映射到数组,例如:
jq -Rc 'split(",") | map(fromjson)' myfile.json
输出:
[{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2}]
但是,如果您正在处理大量输入,可能使用更强大的可命令命令将输入拆分为块,例如与tr
:
<myfile.json tr ',' '\n' | jq -c .
输出:
{"a":1}
{"b":2}
{"c":3}
{"d":2}
{"e":1}
{"f":2}
答案 1 :(得分:1)
由于你有数百万这些JSON对象,让我首先建议一种有效的方法来生成JSON-Lines格式的流(即使用&#34;换行符#34;作为分隔符)。
警告:以下假设对象不包含JSON字符串。
假设逗号分隔的对象位于名为objects.txt的文件中。 首先,使用以下jq程序创建一个文件program.jq:
def one:
(try input catch null)
| if . == 0 then empty elif . == null then one else (., one) end;
one
然后假设你的shell允许它,调用:
(cat objects.txt; echo 0) |
sed $'s/,/,\\\n/g' |
jq -n -c -f program.jq objects.txt
将生成流,每行一个JSON对象。这是一种非常易于管理的格式。例如,要生成数组,可以将上述流传输到jq -s .
但是,如果目标只是生成一个JSON数组,那么正如其他地方所指出的那样,最有效的方法是将逗号分隔的对象括在方括号中,沿着以下几行:
(echo "["; cat objects.txt; echo "]")
所以这里的相关问题也许是:真正的目标是什么?令人怀疑的是,拥有一个难以管理的大型小JSON对象可能比原始逗号分隔序列或简单流更有用。