Я хотел бы сравнить два файла json и сообщить о различиях, но меня интересуют только ключи и значения нет. Так, например, «json-diff» между следующими двумя файлами (конечно, они намного сложнее):
{
"http": {
"https": true,
"swagger": {
"enabled": false
},
"scalingFactors": [0.1, 0.2]
}
}
{
"http": {
"https": true,
"swagger": {
"enabled": true
},
"scalingFactors": [0.1, 0.1],
"test": true
}
}
должен сообщить, что отсутствует ключ:
http.test
но
не должен сообщать, что следующие ключи имеют разные значения:
http.swagger.enabled
http.scalingFactors
Я посмотрел на инструмент jq
, но не знаю, как игнорировать значения.
jq '[paths] - [input | paths]' file1.json file2.json
будет полезен? Демо
Игнорируя потенциальные сложности, связанные с массивами, имело бы смысл рассмотреть «симметричную разницу» наборов путей к скалярам. Таким образом, в качестве отправной точки вы можете рассмотреть:
jq -c '
[paths(scalars)] as $f1
| [input | paths(scalars)] as $f2
| ($f1 - $f2) + ($f2 - $f1)' file1.json file2.json
Возможно, вы захотите преобразовать пути в строки, но опять же, может быть разумно не делать этого, если сопоставление со строками необратимо.
Если присутствуют массивы, вы можете сравнить пути, игнорируя индексы массива:
def p: [paths(scalars) | map(select(type= = "string"))] | unique;
p as $f1
| (input | p) as $f2
| ($f1 - $f2) + ($f2 - $f1)
| .[]
Последняя строка гарантирует, что результатом будет (возможно, пустой) поток, и дело в том, что это упрощает проверку кода возврата, чтобы определить, было ли обнаружено какое-либо различие: просто используйте параметр командной строки -e. Если различий нет, код возврата будет равен 4.
Один из способов проверить, пуст ли поток, — использовать -4.
Я проверил это с нашими jsons, и действительно есть проблема с массивами. Что потребуется, чтобы он работал и с массивами?
pb100 - Вы видимо еще не ответили на самый первый "комментарий" выше.
Какой комментарий? Этот ?
Да, это самый первый комментарий.
Я борюсь с этим вопросом, так как не знаю, что такое модель json и как ее описать.
pb100 - В двух словах, что вы ожидаете от массивов? Соответствует ли часть 2 моего ответа вашим требованиям? Максимально соблюдайте рекомендации минимальный воспроизводимый пример.
пик - я только что обновил содержимое json. Ваша часть 2 почти работает - когда вы используете приведенный выше код, вы увидите, что он не работает на "http.swagger.enabled"
кроме того - я вижу, что для проверки того, не удалось это или нет, нужно использовать, например: wc
или grep
?
pb100 — см. обновление о том, как использовать код возврата для выполнения теста.
Не могли бы вы поделиться своей моделью JSON, это просто массивы? если да, то как вы хотите с ними справиться?