Получение разницы двух строк JSON с использованием кода Java
Может ли кто-нибудь предложить некоторую библиотеку или код Java получить разницу двух строк JSON?
Ответы
Ответ 1
У меня была такая же проблема, и в итоге я написал свою собственную библиотеку:
https://github.com/algesten/jsondiff
Он выполняет как различие/исправление.
Diffs являются самими JSON-объектами и имеют простой синтаксис для слияния/замены объекта и вставки/замены массива.
Пример:
original
{
a: { b: 42 }
}
patch
{
"~a" { c: 43 }
}
~
указывает на слияние объектов.
result
{
a: { b: 42, c: 43 }
}
Ответ 2
Для одного конкретного предложения вы можете использовать Jackson, привязать строки JSON к деревьям JSON и сравнить их для равенства. Что-то вроде:
ObjectMapper mapper = new ObjectMapper();
JsonNode tree1 = mapper.readTree(jsonString1);
JsonNode tree2 = mapper.readTree(jsonString2);
if (tree1.equals(tree2)) {
// yes, contents are equal -- note, ordering of arrays matters, objects not
} else {
// not equal
}
сравнение равен по значению и должно работать как ожидалось в отношении массивов JSON, объектов и примитивных значений.
Ответ 3
Лично я предложил бы сериализацию строк JSON обратно в объекты и сравнение объектов.
Таким образом, вам не нужно беспокоиться о дополнительных пробелах/форматировании между двумя строками JSON (две строки могут быть отформатированы совершенно разными и по-прежнему представляют собой равные объекты).
Ответ 4
Вышеуказанные ответы только проверяют Json на равенство. Если вы хотите получить diff, посмотрите на библиотеку javers.
Преобразуйте json в java-объекты с помощью Jackson, а затем используйте javers для сравнения значений объектов, чтобы получить diff.
Вот пример фрагмента кода. (Предполагая, что p1, p2 - два java-объекта)
Javers j = JaversBuilder.javers().build();
Diff diff = j.compare(p1, p2);
if (diff.hasChanges()) {
List<Change> changes = diff.getChanges();
for (Change change : changes) {
if (change instanceof ValueChange) {
ValueChange valChange = (ValueChange) change;
System.out.println(valChange.getPropertyName() + " -- " + valChange.getLeft() + "--"+valchange.getRight());
}
}
Это даст вам разницу в качестве значения ключа и ожидаемых и актуальных значений.