Сравнение двух JSON - PullRequest
       3

Сравнение двух JSON

2 голосов
/ 20 августа 2011

Какой лучший способ сравнить две строки JSON в Java?Я хочу иметь возможность распечатывать только разницу в парах ключ / значение.

Я использую библиотеку gson, чтобы преобразовать ее в карту и выполнить утверждение, но она отображает оба JSON:

Type type = new TypeToken<Map<String, String>>() {}.getType();
Gson gson = new Gson();
Map<String, String> mapExpected = gson.fromJson(expectedJson, type);
Map<String, String> mapResponse = gson.fromJson(jsonResponse, type);
Assert.assertEquals(mapExpected, mapResponse);

Есть ли лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

Если вы просто хотите сравнить простое равенство, Джексон сделает это легко;и на всякий случай это может помочь:

JsonNode tree1 = objectMapper.readTree(json1);
JsonNode tree2 = objectMapper.readTree(json2);
if (!tree1.equals(tree2)) { // handle diffing
}

Сейчас;поскольку все объекты JsonNode правильно реализуют проверки на равенство (чтобы порядок ключей не имел значения и т. д.), вы можете использовать это для рекурсивного сравнения, чтобы увидеть, где и как содержимое различается.Для ObjectNode s вы можете получить имена ключей, удалить их (tree1.getFieldNames (). RemoveAll (tree2.getFieldNames ()) и т. Д.

2 голосов
/ 22 августа 2011

Используя решение SJuan76, я смог получить только разницу в парах ключ-значение.

    Type type = new TypeToken<Map<String, String>>() {}.getType();
    Gson gson = new Gson();
    Map<String, String> mapExpected = gson.fromJson(expectedJson, type);
    Map<String, String> mapResponse = gson.fromJson(jsonResponse, type);
    Set<SimpleEntry<String,String>> expectedSet = new HashSet<SimpleEntry<String, String>>();
    Set<SimpleEntry<String, String>> tmpExpectedSet = new HashSet<SimpleEntry<String, String>>();
    Set<SimpleEntry<String, String>> responseSet = new HashSet<SimpleEntry<String, String>>();

    for (String key : mapExpected.keySet()) {
        expectedSet.add(new SimpleEntry<String, String>(key, mapExpected.get(key)));
        tmpExpectedSet.add(new SimpleEntry<String, String>(key, mapExpected.get(key)));
    }

    for (String key : mapResponse.keySet())
        responseSet.add((new SimpleEntry<String, String>(key, mapResponse.get(key))));

    expectedSet.removeAll(responseSet);
    responseSet.removeAll(tmpExpectedSet);
    expectedSet.addAll(responseSet);

    if (!expectedSet.isEmpty()) {
        for (SimpleEntry<String, String> diff : expectedSet)
            log.error(diff.getKey() + ":" + diff.getValue());
    }
2 голосов
/ 20 августа 2011

Это сложно, но это может быть сделано.

Я бы реализовал класс Pair, который содержит и String (ключ и значение) с соответствующими ему equals () и hashcode ();

Затем поместите все элементы из Карта A в качестве пары в наборе (setA) и все элементы из Карта B в другой набор (setB)

Тогда рассчитайте

 Set<Pair> setA_B = setA.removeAll(setB);
 Set<Pair> setB_A = setB.removeAll(setA);
 Set<Pair> result = setA_B.addAll(setB_A);

В result есть только элементы, которые не совпадают. Если все элементы совпадают (обе исходные карты равны), то result пусто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...