From a832e0005c1bc0f4992a6d9feb4cc78107079d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Coll?= Date: Thu, 19 Sep 2019 19:35:39 -0300 Subject: [PATCH] Deserialize WRAPPER_ARRAY with no second parameter as null value --- .../impl/AsArrayTypeDeserializer.java | 3 ++ .../jsontype/TestTypedDeserialization.java | 45 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java index 250db2bd4a..6d736c7fd3 100644 --- a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java @@ -113,6 +113,9 @@ protected Object _deserialize(JsonParser p, DeserializationContext ctxt) throws p = JsonParserSequence.createFlattened(false, tb.asParser(p), p); p.nextToken(); } + if (hadStartArray && p.currentToken() == JsonToken.END_ARRAY) { + return deser.getNullValue(ctxt); + } Object value = deser.deserialize(p, ctxt); // And then need the closing END_ARRAY if (hadStartArray && p.nextToken() != JsonToken.END_ARRAY) { diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypedDeserialization.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypedDeserialization.java index c1ea52c2e7..59ea371ac3 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypedDeserialization.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypedDeserialization.java @@ -6,7 +6,9 @@ import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo.As; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.type.TypeFactory; public class TestTypedDeserialization @@ -66,6 +68,28 @@ public Fish() } } + @JsonDeserialize(using = NullAnimalDeserializer.class) + static class NullAnimal extends Animal + { + public static final NullAnimal NULL_INSTANCE = new NullAnimal(); + + public NullAnimal() { + super(null); + } + } + + static class NullAnimalDeserializer extends JsonDeserializer { + @Override + public NullAnimal getNullValue(final DeserializationContext context) { + return NullAnimal.NULL_INSTANCE; + } + + @Override + public NullAnimal deserialize(final JsonParser parser, final DeserializationContext context) { + throw new UnsupportedOperationException(); + } + } + static class AnimalContainer { public Animal animal; } @@ -239,6 +263,27 @@ public void testIssue506WithNumber() throws Exception Issue506NumberBean output = mapper.readValue(json, Issue506NumberBean.class); assertEquals(input.number, output.number); } + + public void testTypeAsArrayWithNullableType() throws Exception + { + ObjectMapper m = new ObjectMapper(); + m.addMixIn(Animal.class, TypeWithArray.class); + Animal a = m.readValue( + "[\""+Fish.class.getName()+"\"]", Animal.class); + assertNull(a); + } + + public void testTypeAsArrayWithCustomDeserializer() throws Exception + { + ObjectMapper m = new ObjectMapper(); + m.addMixIn(Animal.class, TypeWithArray.class); + Animal a = m.readValue( + "[\""+NullAnimal.class.getName()+"\"]", Animal.class); + assertNotNull(a); + assertEquals(NullAnimal.class, a.getClass()); + NullAnimal c = (NullAnimal) a; + assertNull(c.name); + } }