Преобразовать последовательность из JSON строк (JSONL) в массив JSON - PullRequest
0 голосов
/ 11 марта 2020

У меня есть файл, где каждая строка является 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."}
]

Ответы [ 2 ]

1 голос
/ 11 марта 2020
jq -n '[inputs]' <in.jsonl >out.json

... или, как предложено @ borrible :

jq --slurp . <in.jsonl >out.json
0 голосов
/ 11 марта 2020

Для текущей задачи использование опции "slurp" в jq или [inputs] влечет за собой потенциально огромную трату ресурсов.

Тривиальное, но эффективное решение может быть реализовано в awk следующим образом:

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

Эквивалентное эффективное решение в jq возможно с использованием foreach и inputs и оставлено как осуществление.

...