public static Map<String, Object> deepMerge(Map<String, Object> original, Map<String, Object> newMap) { for (String key : newMap.keySet()) { if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { Map<String, Object> originalChild = (Map<String, Object>) original.get(key); Map<String, Object> newChild = (Map) newMap.get(key); original.put(key, deepMerge(originalChild, newChild)); } else { original.put(key, newMap.get(key)); } } return original; }
public static Map<String, Object> deepMerge(Map<String, Object> original, Map<String, Object> newMap) { for (String key : newMap.keySet()) { if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { Map<String, Object> originalChild = (Map<String, Object>) original.get(key); Map<String, Object> newChild = (Map) newMap.get(key); original.put(key, deepMerge(originalChild, newChild)); } else { original.put(key, newMap.get(key)); } } return original; }
@Test public void shouldMergeToEmptyMap() { Map<String, Object> original = new HashMap<>(); Map<String, Object> element = new HashMap<>(); element.put("a", "b"); Map<String, Object> element2 = new HashMap<>(); element2.put("c", "d"); element.put("e", element2); IOUtil.deepMerge(original, element); assertThat(original.containsKey("a"), is(true)); assertThat(original.containsKey("e"), is(true)); assertThat((String) original.get("a"), is("b")); Map<String, Object> innerElement = (Map<String, Object>) original.get("e"); assertThat(innerElement.containsKey("c"), is(true)); assertThat((String) innerElement.get("c"), is("d")); }
@Test public void shouldOverrideSimpleAndComplexElements() { Map<String, Object> original = new HashMap<>(); Map<String, Object> org = new HashMap<>(); org.put("a", "1"); Map<String, Object> org2 = new HashMap<>(); org2.put("c", "2"); org.put("e", org2); Map<String, Object> element = new HashMap<>(); element.put("a", "b"); Map<String, Object> element2 = new HashMap<>(); element2.put("c", "d"); element.put("e", element2); IOUtil.deepMerge(original, element); assertThat(original.containsKey("a"), is(true)); assertThat(original.containsKey("e"), is(true)); assertThat((String) original.get("a"), is("b")); Map<String, Object> innerElement = (Map<String, Object>) original.get("e"); assertThat(innerElement.containsKey("c"), is(true)); assertThat((String) innerElement.get("c"), is("d")); } }
@Test public void shouldAddSimpleAndComplexElements() { Map<String, Object> original = new HashMap<>(); original.put("z", "y"); Map<String, Object> element = new HashMap<>(); element.put("a", "b"); Map<String, Object> element2 = new HashMap<>(); element2.put("c", "d"); element.put("e", element2); IOUtil.deepMerge(original, element); assertThat(original.containsKey("a"), is(true)); assertThat(original.containsKey("e"), is(true)); assertThat(original.containsKey("z"), is(true)); assertThat((String) original.get("a"), is("b")); assertThat((String) original.get("z"), is("y")); Map<String, Object> innerElement = (Map<String, Object>) original.get("e"); assertThat(innerElement.containsKey("c"), is(true)); assertThat((String) innerElement.get("c"), is("d")); }