diff --git a/src/main/scala/com/fasterxml/jackson/module/scala/deser/GenericFactoryDeserializerResolver.scala b/src/main/scala/com/fasterxml/jackson/module/scala/deser/GenericFactoryDeserializerResolver.scala index 5548b2ffe..3ff9d58f4 100644 --- a/src/main/scala/com/fasterxml/jackson/module/scala/deser/GenericFactoryDeserializerResolver.scala +++ b/src/main/scala/com/fasterxml/jackson/module/scala/deser/GenericFactoryDeserializerResolver.scala @@ -76,9 +76,15 @@ abstract class GenericFactoryDeserializerResolver[CC[_], CF[X[_]]] extends Deser override def getContentDeserializer: JsonDeserializer[AnyRef] = containerDeserializer.getContentDeserializer - override def deserialize(jp: JsonParser, ctxt: DeserializationContext): CC[_] = + override def deserialize(jp: JsonParser, ctxt: DeserializationContext): CC[_] = { containerDeserializer.deserialize(jp, ctxt) match { case wrapper: BuilderWrapper[_] => wrapper.builder.result() } + } + + override def getEmptyValue(ctxt: DeserializationContext): Object = { + val bw = containerDeserializer.getValueInstantiator.createUsingDefault(ctxt).asInstanceOf[BuilderWrapper[AnyRef]] + bw.builder.result().asInstanceOf[Object] + } } } diff --git a/src/test/scala/com/fasterxml/jackson/module/scala/deser/SeqDeserializerTest.scala b/src/test/scala/com/fasterxml/jackson/module/scala/deser/SeqDeserializerTest.scala index f165ef70b..218d55927 100644 --- a/src/test/scala/com/fasterxml/jackson/module/scala/deser/SeqDeserializerTest.scala +++ b/src/test/scala/com/fasterxml/jackson/module/scala/deser/SeqDeserializerTest.scala @@ -2,13 +2,18 @@ package com.fasterxml.jackson.module.scala.deser import java.util.UUID +import com.fasterxml.jackson.annotation.{JsonSetter, Nulls} +import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.exc.InvalidFormatException -import com.fasterxml.jackson.module.scala.JacksonModule +import com.fasterxml.jackson.module.scala.{DefaultScalaModule, JacksonModule} import org.junit.runner.RunWith import org.scalatestplus.junit.JUnitRunner import scala.collection.{immutable, mutable} +case class JavaListWrapper(s: java.util.ArrayList[String]) +case class SeqWrapper(s: Seq[String]) + @RunWith(classOf[JUnitRunner]) class SeqDeserializerTest extends DeserializerTest { @@ -180,6 +185,17 @@ class SeqDeserializerTest extends DeserializerTest { exceptionPath should equal (List(1)) } + it should "handle AS_NULL" in { + val mapper = new ObjectMapper + mapper.registerModule(new DefaultScalaModule) + mapper.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY)) + val json = """{"s": null}""" + val result1 = mapper.readValue(json, classOf[JavaListWrapper]) + result1 shouldEqual JavaListWrapper(new java.util.ArrayList[String]()) + val result2 = mapper.readValue(json, classOf[SeqWrapper]) + result2 shouldEqual SeqWrapper(Seq.empty) + } + val listJson = "[1,2,3,4,5,6]" val listScala: Range.Inclusive = 1 to 6 }