Как добавить запятую между JSON объектами? - PullRequest
0 голосов
/ 05 марта 2020

Скажем, у меня есть пример файла. json, который выглядит следующим образом. Обратите внимание, что объекты не разделены запятой. Я знаю, что это не JSON файл без запятых.

[
  {
    "type": "message",
    "user": "U024HFHU5",
    "text": "hey there",
    "ts": "1385407681.000003"
  }
  {
    "type": "message",
    "user": "U024HGJ4E",
    "text": "right back at you",
    "ts": "1385407706.000006"
  }
]

Как мне сделать так, чтобы это выглядело так (пример из того, что я получил из https://thoughtbot.com/blog/jq-is-sed-for-json .)

[
  {
    "type": "message",
    "user": "U024HFHU5",
    "text": "hey there",
    "ts": "1385407681.000003"
  },
  {
    "type": "message",
    "user": "U024HGJ4E",
    "text": "right back at you",
    "ts": "1385407706.000006"
  }
]

Я пытался делать}, {как некоторые предлагали, но это не работает.

Я думаю, что это, вероятно, что-то подобное в командной строке jq, но я не уверен , Здесь я надеюсь, что sample2. json выведет нужный формат.

jq -r '. | join(", ")' sample.json > sample2.json

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Использование human JSON утилита для восстановления искаженного JSON файла:

hjson -j file
[
  {
    "type": "message",
    "user": "U024HFHU5",
    "text": "hey there",
    "ts": "1385407681.000003"
  },
  {
    "type": "message",
    "user": "U024HGJ4E",
    "text": "right back at you",
    "ts": "1385407706.000006"
  }
]

Опция -j выводит файл с правильным синтаксисом JSON, добавляя пропущенная запятая между объектами.

2 голосов
/ 06 марта 2020

Если бы квадратные скобки отсутствовали на входе, jq мог бы обработать его как обычный поток объектов. Затем вы можете выбросить их в массив или что-то еще.

В этом случае вам просто нужно будет дважды вызвать jq. Сначала прочитайте его в необработанном виде (-Rs) и обрежьте начальные и конечные скобки, выведите его в необработанном виде (-r), затем обработайте в jq, как обычно.

$ jq -Rsr 'gsub("^\\s*\\[|\\]\\s*$"; "")' input.json | jq -n '[inputs]'
...