@@ -3,16 +3,18 @@ package com.fasterxml.jackson.module.scala.deser
3
3
import com .fasterxml .jackson .core .{JsonParser , JsonToken }
4
4
import com .fasterxml .jackson .databind ._
5
5
import com .fasterxml .jackson .databind .`type` .{ReferenceType , TypeFactory }
6
- import com .fasterxml .jackson .databind .deser .std .StdDeserializer
6
+ import com .fasterxml .jackson .databind .deser .std .ReferenceTypeDeserializer
7
7
import com .fasterxml .jackson .databind .deser .{ContextualDeserializer , Deserializers }
8
8
import com .fasterxml .jackson .databind .jsontype .TypeDeserializer
9
9
import com .fasterxml .jackson .module .scala .modifiers .OptionTypeModifierModule
10
10
11
+ import scala .util .control .NonFatal
12
+
11
13
private class OptionDeserializer (fullType : JavaType ,
12
14
valueTypeDeserializer : Option [TypeDeserializer ],
13
15
valueDeserializer : Option [JsonDeserializer [AnyRef ]],
14
16
beanProperty : Option [BeanProperty ] = None )
15
- extends StdDeserializer [Option [AnyRef ]](fullType) with ContextualDeserializer {
17
+ extends ReferenceTypeDeserializer [Option [AnyRef ]](fullType, valueTypeDeserializer.orNull, valueDeserializer.orNull ) with ContextualDeserializer {
16
18
17
19
override def getValueType : JavaType = fullType
18
20
@@ -27,9 +29,10 @@ private class OptionDeserializer(fullType: JavaType,
27
29
typeDeser == this .valueTypeDeserializer &&
28
30
valueDeser == this .valueDeserializer &&
29
31
beanProperty == this .beanProperty) {
30
- return this
32
+ this
33
+ } else {
34
+ new OptionDeserializer (fullType, typeDeser, valueDeser.asInstanceOf [Option [JsonDeserializer [AnyRef ]]], beanProperty)
31
35
}
32
- new OptionDeserializer (fullType, typeDeser, valueDeser.asInstanceOf [Option [JsonDeserializer [AnyRef ]]], beanProperty)
33
36
}
34
37
35
38
override def createContextual (ctxt : DeserializationContext , property : BeanProperty ): JsonDeserializer [Option [AnyRef ]] = {
@@ -69,9 +72,32 @@ private class OptionDeserializer(fullType: JavaType,
69
72
if (t == JsonToken .VALUE_NULL ) {
70
73
getNullValue(ctxt)
71
74
} else {
72
- 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
+ }
73
84
}
74
85
}
86
+
87
+ override def referenceValue (contents : Any ): Option [AnyRef ] = {
88
+ Option (contents) match {
89
+ case Some (anyRef : AnyRef ) => Some (anyRef)
90
+ case _ => None
91
+ }
92
+ }
93
+
94
+ override def withResolved (typeDeser : TypeDeserializer , valueDeser : JsonDeserializer [_]): ReferenceTypeDeserializer [Option [AnyRef ]] = {
95
+ new OptionDeserializer (fullType, Some (typeDeser), valueDeser.asInstanceOf [Option [JsonDeserializer [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
75
101
}
76
102
77
103
private object OptionDeserializerResolver extends Deserializers .Base {
0 commit comments