В принципі, якщо у вас є доступ до bash або іншої вдосконаленої оболонки, ви можете зробити щось подібне
cmp <(jq -cS . A.json) <(jq -cS . B.json)
з використанням підпроцесів. Це відформатує json за допомогою відсортованих ключів та послідовного представлення плаваючих крапок. Це єдині дві причини, яких я можу придумати, чому json з однаковим вмістом друкується по-різному. Тому після простого порівняння рядків ви отримаєте належний тест. Напевно, також варто зазначити, що якщо ви не можете використовувати bash, ви можете отримати однакові результати з тимчасовими файлами, це просто не так чисто.
Це не зовсім відповідає на ваше запитання, тому що, як ви висловили питання, яке хотіли ["John", "Bryan"]
і["Bryan", "John"]
порівняти однаково. Оскільки json не має поняття набору, а лише перелік, їх слід вважати різними. Порядок важливий для списків. Вам довелося б написати якесь власне порівняння, якщо ви хочете, щоб вони порівнювались однаково, і для цього вам потрібно було б визначити, що ви маєте на увазі під рівністю. Чи порядок має значення для всіх списків чи лише для деяких? А як щодо дублюючих елементів? Якщо ви хочете, щоб вони були представлені у вигляді набору, а елементи є рядками, ви можете помістити їх у такі об’єкти, як {"John": null, "Bryan": null}
. Порядок не матиме значення при порівнянні показників рівності.
Оновлення
З обговорення коментарів: Якщо ви хочете краще зрозуміти, чому json не той, то
diff <(jq -S . A.json) <(jq -S . B.json)
дасть більше інтерпретованих результатів. vimdiff
може бути кращою різниця залежно від смаку.
--argfile a a.json
на--arg a $a
(будучи $ aa json рядком), не пощастивши. будь-яка ідея, як підійти до рядків, а не до файлів?