Используя решение 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());
}