Skip to content

Commit 31efc10

Browse files
committed
collection deserializer should create empty collection instead of null
1 parent 3498bc1 commit 31efc10

File tree

4 files changed

+27
-5
lines changed

4 files changed

+27
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.fasterxml.jackson.module.scala.deser;
2+
3+
import com.fasterxml.jackson.databind.DeserializationContext;
4+
import com.fasterxml.jackson.databind.JavaType;
5+
import com.fasterxml.jackson.databind.JsonMappingException;
6+
import com.fasterxml.jackson.databind.deser.std.ContainerDeserializerBase;
7+
8+
/**
9+
* Internal Usage only
10+
*/
11+
abstract class ContainerDeserializerWithNullValueAsEmpty<T> extends ContainerDeserializerBase<T> {
12+
13+
protected ContainerDeserializerWithNullValueAsEmpty(JavaType selfType) {
14+
super(selfType);
15+
}
16+
17+
@Override
18+
public T getNullValue(DeserializationContext ctxt) throws JsonMappingException {
19+
return (T) getEmptyValue(ctxt);
20+
}
21+
}

src/main/scala/com/fasterxml/jackson/module/scala/deser/GenericFactoryDeserializerResolver.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import java.util
44
import com.fasterxml.jackson.core.JsonParser
55
import com.fasterxml.jackson.databind._
66
import com.fasterxml.jackson.databind.`type`.CollectionLikeType
7-
import com.fasterxml.jackson.databind.deser.std.{CollectionDeserializer, ContainerDeserializerBase, StdValueInstantiator}
7+
import com.fasterxml.jackson.databind.deser.std.{CollectionDeserializer, StdValueInstantiator}
88
import com.fasterxml.jackson.databind.deser.{ContextualDeserializer, Deserializers, ValueInstantiator}
99
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer
1010

@@ -105,7 +105,7 @@ abstract class GenericFactoryDeserializerResolver[CC[_], CF[X[_]]] extends Deser
105105
}
106106

107107
private class Deserializer[A](collectionType: JavaType, containerDeserializer: CollectionDeserializer)
108-
extends ContainerDeserializerBase[CC[A]](collectionType)
108+
extends ContainerDeserializerWithNullValueAsEmpty[CC[A]](collectionType)
109109
with ContextualDeserializer {
110110

111111
def this(collectionType: JavaType, valueDeser: JsonDeserializer[Object], valueTypeDeser: TypeDeserializer, valueInstantiator: ValueInstantiator) = {

src/main/scala/com/fasterxml/jackson/module/scala/deser/GenericMapFactoryDeserializerResolver.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.{JsonParser, StreamReadCapability}
44
import com.fasterxml.jackson.databind._
55
import com.fasterxml.jackson.databind.`type`.MapLikeType
66
import com.fasterxml.jackson.databind.deser.{ContextualDeserializer, Deserializers, ValueInstantiator}
7-
import com.fasterxml.jackson.databind.deser.std.{ContainerDeserializerBase, MapDeserializer, StdValueInstantiator}
7+
import com.fasterxml.jackson.databind.deser.std.{MapDeserializer, StdValueInstantiator}
88
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer
99

1010
import scala.collection.mutable.ListBuffer
@@ -124,7 +124,7 @@ abstract class GenericMapFactoryDeserializerResolver[CC[K, V], CF[X[_, _]]] exte
124124
}
125125

126126
private class Deserializer[K, V](mapType: MapLikeType, containerDeserializer: MapDeserializer)
127-
extends ContainerDeserializerBase[CC[K, V]](mapType) with ContextualDeserializer {
127+
extends ContainerDeserializerWithNullValueAsEmpty[CC[K, V]](mapType) with ContextualDeserializer {
128128

129129
def this(mapType: MapLikeType, valueInstantiator: ValueInstantiator,
130130
keyDeser: KeyDeserializer, valueDeser: JsonDeserializer[_], valueTypeDeser: TypeDeserializer) = {

src/test/scala/com/fasterxml/jackson/module/scala/deser/CaseClassDeserializerTest.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ class CaseClassDeserializerTest extends DeserializerTest {
200200
it should "support deserializing null input for list as empty list" in {
201201
val input = """{}"""
202202
val result = deserialize(input, classOf[ListHolder[String]])
203-
result.list shouldBe null // ideally should be empty list, Scala users expect no nulls
203+
// result.list used to be null until v2.19.0
204+
result.list shouldBe List.empty
204205
}
205206

206207
it should "support deserializing null input for list as empty list (JsonSetter annotation)" in {

0 commit comments

Comments
 (0)