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