首先,我们必须将对象转换为映射表:
public Map<String, Object> objectToMap(Object object) throws JsonProcessingException {
var mapper = new ObjectMapper();
final var type = new TypeReference<HashMap<String, Object>>() {
};
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
return mapper.readValue(ow.writeValueAsString(object), type);
}
然后将地图转换为扁平地图:
public Map<String, Object> flatten(Map<String, Object> map) {
return map.entrySet().stream()
.flatMap(this::flatten)
.collect(LinkedHashMap::new, (m, e) -> m.put(camelToUnderScore("/" + e.getKey()), e.getValue()),
LinkedHashMap::putAll);
}
public Stream<Map.Entry<String, Object>> flatten(Map.Entry<String, Object> entry) {
if (entry == null) {
return Stream.empty();
}
if (entry.getValue() instanceof Map<?, ?>) {
return ((Map<?, ?>) entry.getValue()).entrySet().stream()
.flatMap(e -> flatten(
new AbstractMap.SimpleEntry<>(camelToUnderScore(entry.getKey() + "/" + e.getKey()),
e.getValue())));
}
if (entry.getValue() instanceof List<?>) {
List<?> list = (List<?>) entry.getValue();
return IntStream.range(0, list.size())
.mapToObj(i -> new AbstractMap.SimpleEntry<String, Object>(
camelToUnderScore(entry.getKey() + "/" + i), list.get(i)))
.flatMap(this::flatten);
}
return Stream.of(entry);
}
最后调用getDifferenceBetween2Maps来获取差异:
public Map<String, Object> getDifferenceBetween2Maps(final Map<String, Object> leftFlatMap,
final Map<String, Object> rightFlatMap) {
final MapDifference<String, Object> difference = Maps.difference(leftFlatMap, rightFlatMap);
var differencesList = new HashMap<String, Object>();
differencesList.putAll(difference.entriesOnlyOnLeft());
differencesList.putAll(difference.entriesOnlyOnRight());
return differencesList;
}
使用示例:
Map<String, Object> oldObjectFlatMap = flatten(objectToMap(oldObject));
Map<String, Object> newObjectFlatMap = flatten(objectToMap(newObject));
var differencesList = getDifferenceBetween2Maps(oldObjectFlatMap , newObjectFlatMap);