3

我有一个文件,其中每一行都是一个 JSON 对象。我想将文件转换为 JSON 数组。

该文件看起来像这样:

{"address":"email1@foo.bar.com", "topic":"Some topic."}
{"address":"email2@foo.bar.com", "topic":"Another topic."}
{"address":"email3@foo.bar.com", "topic":"Yet another topic."}

我正在使用 bash 和 jq。

我试过了

jq --slurp --raw-input 'split("\n")[:-1]' my_file

但这只是将每一行视为创建字符串 JSON 数组的字符串。

[
  "{\"address\":\"email1@foo.bar.com\", \"topic\":\"Some topic.\"}",
  "{\"address\":\"email2@foo.bar.com\", \"topic\":\"Another topic.\"}",
  "{\"address\":\"email3@foo.bar.com\", \"topic\":\"Yet another topic.\"}"
]

我想要:

[
  {"address":"email1@foo.bar.com", "topic":"Some topic."},
  {"address":"email2@foo.bar.com", "topic":"Another topic."},
  {"address":"email3@foo.bar.com", "topic":"Yet another topic."}
]
4

2 回答 2

5
jq -n '[inputs]' <in.jsonl >out.json

...或者,正如@borrible 所建议的

jq --slurp . <in.jsonl >out.json
于 2020-03-11T15:18:41.487 回答
2

对于手头的任务,使用 jq 的“slurp”选项或[inputs]可能会造成巨大的资源浪费。

一个简单但有效的解决方案可以在 awk 中实现,如下所示:

awk 'BEGIN {print "[";} NF==0{next;} n=="" {print;n++;next;} {print ","; print;} END {print "]"}'

jq 中的等效有效解决方案可以使用foreachand inputs,并留作练习。

于 2020-03-11T17:31:11.570 回答