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 904f8bc0a7..f92b46effd 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 ede4212122..f351aafa1e 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 @@ -20,6 +22,12 @@ static class MergedX 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" });