/** * Merges in another JSON object. * <p> * This is the equivalent of putting all the entries of the other JSON object into this object. This is not a deep * merge, entries containing (sub) JSON objects will be replaced entirely. */ public JsonObject mergeIn(final JsonObject other) { return mergeIn(other, 1); }
/** * Merges in another JSON object. * A deep merge (recursive) matches (sub) JSON objects in the existing tree and replaces all * matching entries. JsonArrays are treated like any other entry, i.e. replaced entirely. */ public JsonObject mergeInDeep(final JsonObject other) { return mergeIn(other, Integer.MAX_VALUE); }
/** * Merges in another JSON object. * The merge is deep (recursive) to the specified level. If depth is 0, no merge is performed, * if depth is greater than the depth of one of the objects, a full deep merge is performed. */ @SuppressWarnings("unchecked") public JsonObject mergeIn(final JsonObject other, final int depth) { if (depth < 1) { return this; } if (depth == 1) { map.putAll(other.map); return this; } for (Map.Entry<String, Object> e : other.map.entrySet()) { map.merge(e.getKey(), e.getValue(), (oldVal, newVal) -> { if (oldVal instanceof Map) { oldVal = new JsonObject((Map) oldVal); } if (newVal instanceof Map) { newVal = new JsonObject((Map) newVal); } if (oldVal instanceof JsonObject && newVal instanceof JsonObject) { return ((JsonObject) oldVal).mergeIn((JsonObject) newVal, depth - 1); } return newVal; }); } return this; }
@Test void testMergeInFlat() { JsonParsers.forEachParser(jsonParser -> { JsonObject obj1 = jsonParser.parseAsJsonObject("{ \"foo\": { \"bar\": \"flurb\", \"eek\": 32 }}"); JsonObject obj2 = jsonParser.parseAsJsonObject("{ \"foo\": { \"bar\": \"eek\" }}"); obj1.mergeIn(obj2); assertEquals(1, obj1.size()); assertEquals(1, obj1.getJsonObject("foo").size()); assertEquals("eek", obj1.getJsonObject("foo").getString("bar")); }); }
@Test void testMergeIn2() { JsonObject obj1 = new JsonObject().put("foo", "bar"); JsonObject obj2 = new JsonObject().put("foo", "flurb"); obj1.mergeIn(obj2); assertEquals(1, obj1.size()); assertEquals("flurb", obj1.getString("foo")); assertEquals(1, obj2.size()); assertEquals("flurb", obj2.getString("foo")); }
@Test void testMergeInDepth0() { { JsonObject obj1 = JsonParser.create().parseAsJsonObject("{ \"foo\": { \"bar\": \"flurb\" }}"); JsonObject obj2 = JsonParser.create().parseAsJsonObject("{ \"foo\": { \"bar\": \"eek\" }}"); obj1.mergeIn(obj2, 0); assertEquals(1, obj1.size()); assertEquals(1, obj1.getJsonObject("foo").size()); assertEquals("flurb", obj1.getJsonObject("foo").getString("bar")); } { JsonObject obj1 = JsonParser.createLazyOne().parseAsJsonObject("{ \"foo\": { \"bar\": \"flurb\" }}"); JsonObject obj2 = JsonParser.createLazyOne().parseAsJsonObject("{ \"foo\": { \"bar\": \"eek\" }}"); obj1.mergeIn(obj2, 0); assertEquals(1, obj1.size()); assertEquals(1, obj1.getJsonObject("foo").size()); assertEquals("flurb", obj1.getJsonObject("foo").getString("bar")); } }
@Test void testMergeIn1() { JsonObject jsonObject = new JsonObject(); JsonObject obj1 = new JsonObject().put("foo", "bar"); JsonObject obj2 = new JsonObject().put("eek", "flurb"); obj1.mergeIn(obj2); assertEquals(2, obj1.size()); assertEquals("bar", obj1.getString("foo")); assertEquals("flurb", obj1.getString("eek")); assertEquals(1, obj2.size()); assertEquals("flurb", obj2.getString("eek")); }
@Test void testMergeInDepth1() { { JsonObject obj1 = JsonParser.create().parseAsJsonObject("{ \"foo\": \"bar\", \"flurb\": { \"eek\": \"foo\", \"bar\": \"flurb\"}}"); JsonObject obj2 = JsonParser.create().parseAsJsonObject("{ \"flurb\": { \"bar\": \"flurb1\" }}"); obj1.mergeIn(obj2, 1); assertEquals(2, obj1.size()); assertEquals(1, obj1.getJsonObject("flurb").size()); assertEquals("flurb1", obj1.getJsonObject("flurb").getString("bar")); } { JsonObject obj1 = JsonParser.createLazyOne().parseAsJsonObject("{ \"foo\": \"bar\", \"flurb\": { \"eek\": \"foo\", \"bar\": \"flurb\"}}"); JsonObject obj2 = JsonParser.createLazyOne().parseAsJsonObject("{ \"flurb\": { \"bar\": \"flurb1\" }}"); obj1.mergeIn(obj2, 1); assertEquals(2, obj1.size()); assertEquals(1, obj1.getJsonObject("flurb").size()); assertEquals("flurb1", obj1.getJsonObject("flurb").getString("bar")); } }
@Test void testMergeInDepth2() { { JsonObject obj1 = new JsonObject(JsonParser.create().parse("{ \"foo\": \"bar\", \"flurb\": { \"eek\": \"foo\", \"bar\": \"flurb\"}}")); JsonObject obj2 = new JsonObject(JsonParser.create().parse("{ \"flurb\": { \"bar\": \"flurb1\" }}")); obj1.mergeIn(obj2, 2); assertEquals(2, obj1.size()); assertEquals(2, obj1.getJsonObject("flurb").size()); assertEquals("foo", obj1.getJsonObject("flurb").getString("eek")); assertEquals("flurb1", obj1.getJsonObject("flurb").getString("bar")); } { JsonObject obj1 = new JsonObject(JsonParser.createLazyOne().parse("{ \"foo\": \"bar\", \"flurb\": { \"eek\": \"foo\", \"bar\": \"flurb\"}}")); JsonObject obj2 = new JsonObject(JsonParser.createLazyOne().parse("{ \"flurb\": { \"bar\": \"flurb1\" }}")); obj1.mergeIn(obj2, 2); assertEquals(2, obj1.size()); assertEquals(2, obj1.getJsonObject("flurb").size()); assertEquals("foo", obj1.getJsonObject("flurb").getString("eek")); assertEquals("flurb1", obj1.getJsonObject("flurb").getString("bar")); } }