diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java index 21f7c9d9f4..77a8e76e27 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java @@ -360,6 +360,10 @@ protected T _deserializeWrappedValue(JsonParser p, DeserializationContext ctxt) T result = (T) handleNestedArrayForSingle(p, ctxt); return result; } + // 11-Dec-2024: [databind#4844] Caller needs to handle nulls before delegating + if (p.hasToken(JsonToken.VALUE_NULL)) { + return getNullValue(ctxt); + } return (T) deserialize(p, ctxt); } diff --git a/src/test/java/com/fasterxml/jackson/databind/struct/UnwrapSingleArrayMiscTest.java b/src/test/java/com/fasterxml/jackson/databind/struct/UnwrapSingleArrayMiscTest.java index 80e2973e24..82be3f80f1 100644 --- a/src/test/java/com/fasterxml/jackson/databind/struct/UnwrapSingleArrayMiscTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/struct/UnwrapSingleArrayMiscTest.java @@ -6,6 +6,8 @@ import org.junit.jupiter.api.Test; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.exc.MismatchedInputException; @@ -19,6 +21,10 @@ public class UnwrapSingleArrayMiscTest extends DatabindTestUtil .enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS) .build(); + static class StringWrapper { + public String value; + } + /* /********************************************************** /* Tests methods, POJOs @@ -78,4 +84,16 @@ public void testEnumMapUnwrapping() throws Exception verifyException(e, "more than one value"); } } + + // [databind#4844]: should work for wrapped null values too + @Test + public void testDeserializeArrayWithNullElement() throws Exception + { + StringWrapper v = UNWRAPPING_MAPPER + .readerFor(StringWrapper.class) + .readValue("{\"value\": [null]}"); + + assertNotNull(v); + assertNull(v.value); + } }