Jq конвертирует объекты JSON, разделенные запятыми, в массив

У меня есть файлы, в которых есть N объектов JSON, и они разделены запятой (,)

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

Я хотел бы преобразовать их в один массив JSON с N объектами, используя 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}" ....
]

Любая идея?

Вероятно, проще всего просто заключить введенные вами данные в [.....]

Gerard van Helden 04.04.2018 09:41

Мой файл содержит миллионы объектов json, может быть, это неэффективный способ чтения всего файла?

mike 04.04.2018 09:54

Уточните, может ли какой-либо из объектов JSON содержать более одного ключа и может ли какое-либо из имен или значений ключей содержать запятую.

peak 09.04.2018 13:59
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
3
2 756
2

Ответы 2

Вы на правильном пути, вам просто нужно сопоставить 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}

Поскольку у вас есть миллионы этих объектов JSON, позвольте мне сначала предложить эффективный способ создания потока из них в формате JSON-Lines (т. Е. С «новой строкой» в качестве разделителя).

ВНИМАНИЕ: СЛЕДУЮЩЕЕ ПРЕДПОЛАГАЕТСЯ, ЧТО ОБЪЕКТЫ НЕ СОДЕРЖАТ СТРОКИ JSON с запятыми.

Предположим, что разделенные запятыми объекты находятся в файле с именем objects.txt. Сначала создайте файл program.jq со следующей программой jq:

def one:
  (try input catch null)
  | if . == 0 then empty elif . == null then one else (., one) end;

one

Затем, если ваша оболочка позволяет это, вызов:

 (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 может быть более полезным, чем исходная последовательность, разделенная запятыми, или простой поток.

Другие вопросы по теме