diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer.java index c16cb1e1df..0c0cc0e253 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.lang.reflect.Array; +import java.util.Arrays; import java.util.Objects; import com.fasterxml.jackson.annotation.JsonFormat; @@ -258,8 +259,7 @@ public Object[] deserialize(JsonParser p, DeserializationContext ctxt, return intoValue; } final int offset = intoValue.length; - Object[] result = new Object[offset + arr.length]; - System.arraycopy(intoValue, 0, result, 0, offset); + Object[] result = Arrays.copyOf(intoValue, offset + arr.length); System.arraycopy(arr, 0, result, offset, arr.length); return result; } diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/merge/ArrayMergeTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/merge/ArrayMergeTest.java index bde1c229a5..e8ee19e1a7 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/merge/ArrayMergeTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/merge/ArrayMergeTest.java @@ -9,6 +9,8 @@ import com.fasterxml.jackson.databind.*; +import java.util.Date; + public class ArrayMergeTest extends BaseMapTest { static class MergedX @@ -19,7 +21,13 @@ static class MergedX public MergedX(T v) { value = v; } protected MergedX() { } } - + + static class Merged + { + @JsonMerge(OptBoolean.TRUE) + public Date[] value; + } + /* /******************************************************** /* Test methods @@ -57,6 +65,31 @@ public void testObjectArrayMerging() throws Exception assertEquals("zap", result.value[2]); } + public void testComponentTypeArrayMerging() throws Exception + { + Merged input = new Merged(); + input.value = new Date[] {new Date(1000L)}; + final JavaType type = MAPPER.getTypeFactory().constructType(new TypeReference() {}); + Merged result = MAPPER.readerFor(type) + .withValueToUpdate(input) + .readValue(a2q("{'value':[2000]}")); + assertSame(input, result); + assertEquals(2, result.value.length); + assertEquals(1000L, result.value[0].getTime()); + assertEquals(2000L, result.value[1].getTime()); + + // and with one trick + result = MAPPER.readerFor(type) + .with(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + .withValueToUpdate(input) + .readValue(a2q("{'value':3000}")); + assertSame(input, result); + assertEquals(3, result.value.length); + assertEquals(1000L, result.value[0].getTime()); + assertEquals(2000L, result.value[1].getTime()); + assertEquals(3000L, result.value[2].getTime()); + } + public void testStringArrayMerging() throws Exception { MergedX input = new MergedX(new String[] { "foo" });