Получение разницы двух строк 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());
}
 }

Это даст вам разницу в качестве значения ключа и ожидаемых и актуальных значений.