Используя jq или альтернативные инструменты командной строки для сравнения файлов JSON

Есть ли какие-либо утилиты командной строки, которые могут использоваться, чтобы найти, идентичны ли два файла JSON с инвариантностью упорядочиванию within-list-element и within-dictionary-key?

Мог это быть покончить jq или некоторый другой эквивалентный инструмент?

Примеры:

Эти два файла JSON идентичны

A:

{
  "People": ["John", "Bryan"],
  "City": "Boston",
  "State": "MA"
}

B:

{
  "People": ["Bryan", "John"],
  "State": "MA",
  "City": "Boston"
}

но эти два файла JSON отличаются:

A:

{
  "People": ["John", "Bryan", "Carla"],
  "City": "Boston",
  "State": "MA"
}

C:

{
  "People": ["Bryan", "John"],
  "State": "MA",
  "City": "Boston"
}

Это было бы:

$ some_diff_command A.json B.json

$ some_diff_command A.json C.json
The files are not structurally identical

61
задан 28 April 2019 в 23:51

1 ответ

Сдержание лучше всего из лучших двух ответов для получения jq основывало json разность:

diff \
  <(jq -S 'def post_recurse(f): def r: (f | select(. != null) | r), .; r; def post_recurse: post_recurse(.[]?); (. | (post_recurse | arrays) |= sort)' "$original_json") \
  <(jq -S 'def post_recurse(f): def r: (f | select(. != null) | r), .; r; def post_recurse: post_recurse(.[]?); (. | (post_recurse | arrays) |= sort)' "$changed_json")

Это берет изящное решение для сортировки массива от https://stackoverflow.com/a/31933234/538507 (который позволяет нам рассматривать массивы как наборы), и чистое перенаправление удара в diff от https://stackoverflow.com/a/37175540/538507, Это обращается к случаю, где Вы хотите разность двух json файлов, и порядок содержания массива не релевантен.

0
ответ дан 31 October 2019 в 15:54

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

Похожие вопросы: