Skip to content

Commit 2a26380

Browse files
committed
more work on deserializing null collections
1 parent c7c0ce8 commit 2a26380

File tree

4 files changed

+29
-0
lines changed

4 files changed

+29
-0
lines changed

src/main/scala/tools/jackson/module/scala/deser/ImmutableBitSetDeserializer.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,11 @@ object ImmutableBitSetDeserializer extends StdDeserializer[immutable.BitSet](cla
2828
val elements = arrayNode.values().asScala.toSeq.map(_.asInt())
2929
immutable.BitSet(elements: _*)
3030
}
31+
32+
override def getEmptyValue(ctxt: DeserializationContext): immutable.BitSet =
33+
immutable.BitSet.empty
34+
35+
override def getNullValue(ctxt: DeserializationContext): immutable.BitSet = {
36+
getEmptyValue(ctxt)
37+
}
3138
}

src/main/scala/tools/jackson/module/scala/deser/IntMapDeserializerResolver.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ private[deser] object IntMapDeserializerResolver extends Deserializers.Base {
6969
}
7070

7171
override def getEmptyValue(ctxt: DeserializationContext): Object = IntMap.empty[V]
72+
73+
override def getNullValue(ctxt: DeserializationContext): Object = getEmptyValue(ctxt)
7274
}
7375

7476
private class IntMapInstantiator(config: DeserializationConfig, mapType: MapLikeType) extends StdValueInstantiator(config, mapType) {

src/main/scala/tools/jackson/module/scala/deser/LongMapDeserializerResolver.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ private[deser] object LongMapDeserializerResolver extends Deserializers.Base {
7575
}
7676

7777
override def getEmptyValue(ctxt: DeserializationContext): Object = immutable.LongMap.empty[V]
78+
79+
override def getNullValue(ctxt: DeserializationContext): Object = getEmptyValue(ctxt)
7880
}
7981

8082
private class MutableLongMapDeserializer[V](mapType: MapLikeType, containerDeserializer: MapDeserializer)
@@ -105,6 +107,8 @@ private[deser] object LongMapDeserializerResolver extends Deserializers.Base {
105107
}
106108

107109
override def getEmptyValue(ctxt: DeserializationContext): Object = mutable.LongMap.empty[V]
110+
111+
override def getNullValue(ctxt: DeserializationContext): Object = getEmptyValue(ctxt)
108112
}
109113

110114
private class ImmutableLongMapInstantiator(config: DeserializationConfig, mapType: MapLikeType) extends StdValueInstantiator(config, mapType) {

src/test/scala/tools/jackson/module/scala/deser/CaseClassDeserializerTest.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ object CaseClassDeserializerTest {
7272

7373
case class ListHolder[T](list: List[T])
7474
case class AnnotatedListHolder[T](@JsonSetter(nulls = Nulls.AS_EMPTY)list: List[T])
75+
76+
case class MapHolder[K, V](map: Map[K, V])
77+
case class AnnotatedMapHolder[K, V](@JsonSetter(nulls = Nulls.AS_EMPTY)map: Map[K, V])
7578
}
7679

7780
class CaseClassDeserializerTest extends DeserializerTest {
@@ -211,4 +214,17 @@ class CaseClassDeserializerTest extends DeserializerTest {
211214
val result = deserialize(input, classOf[AnnotatedListHolder[String]])
212215
result.list shouldBe List.empty
213216
}
217+
218+
it should "support deserializing null input for map as empty map" in {
219+
val input = """{}"""
220+
val result = deserialize(input, classOf[MapHolder[Int, String]])
221+
// this result has only happened since 3.0.0 - befpre result.map was null
222+
result.map shouldBe Map.empty
223+
}
224+
225+
it should "support deserializing null input for map as empty list (JsonSetter annotation)" in {
226+
val input = """{}"""
227+
val result = deserialize(input, classOf[AnnotatedMapHolder[Int, String]])
228+
result.map shouldBe Map.empty
229+
}
214230
}

0 commit comments

Comments
 (0)