@@ -4,8 +4,8 @@ import com.fasterxml.jackson.core.{JsonParser, JsonToken}
4
4
import com .fasterxml .jackson .databind .JacksonModule .SetupContext
5
5
import com .fasterxml .jackson .databind ._
6
6
import com .fasterxml .jackson .databind .`type` .{ReferenceType , TypeFactory }
7
+ import com .fasterxml .jackson .databind .deser .std .ReferenceTypeDeserializer
7
8
import com .fasterxml .jackson .databind .deser .Deserializers
8
- import com .fasterxml .jackson .databind .deser .std .StdDeserializer
9
9
import com .fasterxml .jackson .databind .jsontype .TypeDeserializer
10
10
import com .fasterxml .jackson .module .scala .JacksonModule .InitializerBuilder
11
11
import com .fasterxml .jackson .module .scala .ScalaModule
@@ -15,7 +15,7 @@ private class OptionDeserializer(fullType: JavaType,
15
15
valueTypeDeserializer : Option [TypeDeserializer ],
16
16
valueDeserializer : Option [ValueDeserializer [AnyRef ]],
17
17
beanProperty : Option [BeanProperty ] = None )
18
- extends StdDeserializer [Option [AnyRef ]](fullType) {
18
+ extends ReferenceTypeDeserializer [Option [AnyRef ]](fullType, None .orNull, valueTypeDeserializer.orNull, valueDeserializer.orNull ) {
19
19
20
20
override def getValueType : JavaType = fullType
21
21
@@ -29,9 +29,10 @@ private class OptionDeserializer(fullType: JavaType,
29
29
typeDeser == this .valueTypeDeserializer &&
30
30
valueDeser == this .valueDeserializer &&
31
31
beanProperty == this .beanProperty) {
32
- return this
32
+ this
33
+ } else {
34
+ new OptionDeserializer (fullType, typeDeser, valueDeser.asInstanceOf [Option [ValueDeserializer [AnyRef ]]], beanProperty)
33
35
}
34
- new OptionDeserializer (fullType, typeDeser, valueDeser.asInstanceOf [Option [ValueDeserializer [AnyRef ]]], beanProperty)
35
36
}
36
37
37
38
override def createContextual (ctxt : DeserializationContext , property : BeanProperty ): ValueDeserializer [Option [AnyRef ]] = {
@@ -71,9 +72,32 @@ private class OptionDeserializer(fullType: JavaType,
71
72
if (t == JsonToken .VALUE_NULL ) {
72
73
getNullValue(ctxt)
73
74
} else {
74
- typeDeserializer.deserializeTypedFromAny(jp, ctxt).asInstanceOf [Option [AnyRef ]]
75
+ valueTypeDeserializer match {
76
+ case Some (vtd) => Option (vtd.deserializeTypedFromAny(jp, ctxt))
77
+ case _ => {
78
+ typeDeserializer.deserializeTypedFromAny(jp, ctxt) match {
79
+ case Some (any) => referenceValue(any)
80
+ case any => referenceValue(any)
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+
87
+ override def referenceValue (contents : Any ): Option [AnyRef ] = {
88
+ Option (contents) match {
89
+ case Some (anyRef : AnyRef ) => Some (anyRef)
90
+ case _ => None
75
91
}
76
92
}
93
+
94
+ override def withResolved (typeDeser : TypeDeserializer , valueDeser : ValueDeserializer [_]): ReferenceTypeDeserializer [Option [AnyRef ]] = {
95
+ new OptionDeserializer (fullType, Some (typeDeser), valueDeser.asInstanceOf [Option [ValueDeserializer [AnyRef ]]], beanProperty)
96
+ }
97
+
98
+ override def updateReference (reference : Option [AnyRef ], contents : Any ): Option [AnyRef ] = referenceValue(contents)
99
+
100
+ override def getReferenced (reference : Option [AnyRef ]): AnyRef = reference.orNull
77
101
}
78
102
79
103
private class OptionDeserializerResolver (config : ScalaModule .Config ) extends Deserializers .Base {
0 commit comments