jq将逗号分隔的JSON对象转换为数组

时间:2018-04-04 07:38:14

标签: json object jq

我的文件有N个JSON对象,用逗号(,)

分隔
{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2} ...

我想使用jq

将它们转换为一个包含N个对象的JSON数组
[{"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}" ....
]

有什么想法吗?

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对象可能比原始逗号分隔序列或简单流更有用。