scala
import play.api.libs.json._
import com.fasterxml.jackson.databind.ObjectMapper
scala
val sourceJson = Json.parse("""{"name":"John", "age":30, "address":{"city":"New York"}}""")
val targetJson = Json.parse("""{"name":"Doe", "address":{"country":"United States"}}""")
scala
val keepSourceMergedJson = sourceJson.deepMerge(targetJson)(JsonMergeOptions.keepExisting)
val overwriteMergedJson = sourceJson.deepMerge(targetJson)(JsonMergeOptions.overwrite)
val mergeMergedJson = sourceJson.deepMerge(targetJson)(JsonMergeOptions.merge)
scala
println(keepSourceMergedJson)
println(overwriteMergedJson)
println(mergeMergedJson)
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class JsonMergeExample {
public static void main(String[] args) {
try {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode sourceJson = objectMapper.readTree("{\"name\":\"John\", \"age\":30, \"address\":{\"city\":\"New York\"}}");
JsonNode targetJson = objectMapper.readTree("{\"name\":\"Doe\", \"address\":{\"country\":\"United States\"}}");
JsonNode keepSourceMergedJson = mergeJson(sourceJson, targetJson, JsonMergeStrategy.KEEP_SOURCE);
System.out.println(keepSourceMergedJson.toString());
JsonNode overwriteMergedJson = mergeJson(sourceJson, targetJson, JsonMergeStrategy.OVERWRITE);
System.out.println(overwriteMergedJson.toString());
JsonNode mergeMergedJson = mergeJson(sourceJson, targetJson, JsonMergeStrategy.MERGE);
System.out.println(mergeMergedJson.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
private static JsonNode mergeJson(JsonNode source, JsonNode target, JsonMergeStrategy strategy) {
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode mergedJson = objectMapper.createObjectNode();
switch (strategy) {
case KEEP_SOURCE:
mergeWithKeepSource(source, target, mergedJson);
break;
case OVERWRITE:
mergeWithOverwrite(source, target, mergedJson);
break;
case MERGE:
mergeWithMerge(source, target, mergedJson);
break;
}
return mergedJson;
}
private static void mergeWithKeepSource(JsonNode source, JsonNode target, ObjectNode mergedJson) {
for (String fieldName : source.fieldNames()) {
JsonNode sourceValue = source.get(fieldName);
mergedJson.set(fieldName, sourceValue);
}
for (String fieldName : target.fieldNames()) {
if (!mergedJson.has(fieldName)) {
JsonNode targetValue = target.get(fieldName);
mergedJson.set(fieldName, targetValue);
}
}
}
private static void mergeWithOverwrite(JsonNode source, JsonNode target, ObjectNode mergedJson) {
mergedJson.setAll((ObjectNode) source);
mergedJson.setAll((ObjectNode) target);
}
private static void mergeWithMerge(JsonNode source, JsonNode target, ObjectNode mergedJson) {
mergedJson.setAll((ObjectNode) source);
mergedJson.setAll((ObjectNode) target);
for (String fieldName : mergedJson.fieldNames()) {
if (source.has(fieldName) && target.has(fieldName)) {
JsonNode sourceValue = source.get(fieldName);
JsonNode targetValue = target.get(fieldName);
if (sourceValue.isObject() && targetValue.isObject()) {
mergeWithMerge(sourceValue, targetValue, (ObjectNode) mergedJson.get(fieldName));
}
}
}
}
private enum JsonMergeStrategy {
KEEP_SOURCE,
OVERWRITE,
MERGE
}
}