aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2020-07-03 17:05:04 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2020-07-03 17:05:04 -0700
commit09e2e18433224a5e2ce604648ed57f7255fd2119 (patch)
treea5773980ed36ba9844c73e115e847cbbf5a9dc46 /src
parent03b29e98b88f123e0362691acfa8f6707f2cc930 (diff)
downloadjackson-databind-09e2e18433224a5e2ce604648ed57f7255fd2119.tar.gz
Fix a problem with empty value for non-primitive array type deserialization
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/deser/std/ObjectArrayDeserializer.java21
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/type/ArrayType.java15
-rw-r--r--src/test/java/com/fasterxml/jackson/databind/convert/CoerceContainersTest.java8
3 files changed, 37 insertions, 7 deletions
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 f050604da..6225f53ff 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
@@ -12,6 +12,7 @@ import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.fasterxml.jackson.databind.deser.NullValueProvider;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
+import com.fasterxml.jackson.databind.type.ArrayType;
import com.fasterxml.jackson.databind.type.LogicalType;
import com.fasterxml.jackson.databind.util.AccessPattern;
import com.fasterxml.jackson.databind.util.ObjectBuffer;
@@ -26,8 +27,6 @@ public class ObjectArrayDeserializer
{
private static final long serialVersionUID = 1L;
- protected final static Object[] NO_OBJECTS = new Object[0];
-
// // Configuration
/**
@@ -53,20 +52,27 @@ public class ObjectArrayDeserializer
*/
protected final TypeDeserializer _elementTypeDeserializer;
+ /**
+ * @since 2.12
+ */
+ protected final Object[] _emptyValue;
+
/*
/**********************************************************
/* Life-cycle
/**********************************************************
*/
- public ObjectArrayDeserializer(JavaType arrayType,
+ public ObjectArrayDeserializer(JavaType arrayType0,
JsonDeserializer<Object> elemDeser, TypeDeserializer elemTypeDeser)
{
- super(arrayType, null, null);
+ super(arrayType0, null, null);
+ ArrayType arrayType = (ArrayType) arrayType0;
_elementClass = arrayType.getContentType().getRawClass();
_untyped = (_elementClass == Object.class);
_elementDeserializer = elemDeser;
_elementTypeDeserializer = elemTypeDeser;
+ _emptyValue = arrayType.getEmptyArray();
}
protected ObjectArrayDeserializer(ObjectArrayDeserializer base,
@@ -76,6 +82,7 @@ public class ObjectArrayDeserializer
super(base, nuller, unwrapSingle);
_elementClass = base._elementClass;
_untyped = base._untyped;
+ _emptyValue = base._emptyValue;
_elementDeserializer = elemDeser;
_elementTypeDeserializer = elemTypeDeser;
@@ -166,7 +173,9 @@ public class ObjectArrayDeserializer
// need to override as we can't expose ValueInstantiator
@Override // since 2.9
public Object getEmptyValue(DeserializationContext ctxt) throws JsonMappingException {
- return NO_OBJECTS;
+ // 03-Jul-2020, tatu: Must be assignment-compatible; can not just return `new Object[0]`
+ // if element type is different
+ return _emptyValue;
}
/*
@@ -337,7 +346,7 @@ public class ObjectArrayDeserializer
if (p.hasToken(JsonToken.VALUE_NULL)) {
// 03-Feb-2017, tatu: Should this be skipped or not?
if (_skipNullValues) {
- return NO_OBJECTS;
+ return _emptyValue;
}
value = _nullProvider.getNullValue(ctxt);
} else if (_elementTypeDeserializer == null) {
diff --git a/src/main/java/com/fasterxml/jackson/databind/type/ArrayType.java b/src/main/java/com/fasterxml/jackson/databind/type/ArrayType.java
index ef3e6aafb..901b342fe 100644
--- a/src/main/java/com/fasterxml/jackson/databind/type/ArrayType.java
+++ b/src/main/java/com/fasterxml/jackson/databind/type/ArrayType.java
@@ -197,7 +197,20 @@ public final class ArrayType
sb.append('[');
return _componentType.getErasedSignature(sb);
}
-
+
+ /*
+ /**********************************************************
+ /* Extended API
+ /**********************************************************
+ */
+
+ /**
+ * @since 2.12
+ */
+ public Object[] getEmptyArray() {
+ return (Object[]) _emptyArray;
+ }
+
/*
/**********************************************************
/* Standard methods
diff --git a/src/test/java/com/fasterxml/jackson/databind/convert/CoerceContainersTest.java b/src/test/java/com/fasterxml/jackson/databind/convert/CoerceContainersTest.java
index a22326445..163588155 100644
--- a/src/test/java/com/fasterxml/jackson/databind/convert/CoerceContainersTest.java
+++ b/src/test/java/com/fasterxml/jackson/databind/convert/CoerceContainersTest.java
@@ -137,6 +137,14 @@ public class CoerceContainersTest extends BaseMapTest
assertEquals(0, result.length);
}
+ public void testPOJOArray() throws Exception
+ {
+ _verifyNoCoercion(StringWrapper[].class);
+ StringWrapper[] result = _readWithCoercion(StringWrapper[].class);
+ assertNotNull(result);
+ assertEquals(0, result.length);
+ }
+
/*
/********************************************************
/* Helper methods