10
10
import com .fasterxml .jackson .databind .*;
11
11
import com .fasterxml .jackson .databind .annotation .JacksonStdImpl ;
12
12
import com .fasterxml .jackson .databind .deser .ContextualDeserializer ;
13
+ import com .fasterxml .jackson .databind .deser .NullValueProvider ;
13
14
import com .fasterxml .jackson .databind .jsontype .TypeDeserializer ;
14
15
import com .fasterxml .jackson .databind .util .ObjectBuffer ;
15
16
@@ -50,15 +51,6 @@ public class ObjectArrayDeserializer
50
51
*/
51
52
protected final TypeDeserializer _elementTypeDeserializer ;
52
53
53
- /**
54
- * Specific override for this instance (from proper, or global per-type overrides)
55
- * to indicate whether single value may be taken to mean an unwrapped one-element array
56
- * or not. If null, left to global defaults.
57
- *
58
- * @since 2.7
59
- */
60
- protected final Boolean _unwrapSingle ;
61
-
62
54
/*
63
55
/**********************************************************
64
56
/* Life-cycle
@@ -68,78 +60,80 @@ public class ObjectArrayDeserializer
68
60
public ObjectArrayDeserializer (JavaType arrayType ,
69
61
JsonDeserializer <Object > elemDeser , TypeDeserializer elemTypeDeser )
70
62
{
71
- super (arrayType );
63
+ super (arrayType , null , null );
72
64
_elementClass = arrayType .getContentType ().getRawClass ();
73
65
_untyped = (_elementClass == Object .class );
74
66
_elementDeserializer = elemDeser ;
75
67
_elementTypeDeserializer = elemTypeDeser ;
76
- _unwrapSingle = null ;
77
68
}
78
69
79
70
protected ObjectArrayDeserializer (ObjectArrayDeserializer base ,
80
71
JsonDeserializer <Object > elemDeser , TypeDeserializer elemTypeDeser ,
81
- Boolean unwrapSingle )
72
+ NullValueProvider nuller , Boolean unwrapSingle )
82
73
{
83
- super (base . _containerType );
74
+ super (base , nuller , unwrapSingle );
84
75
_elementClass = base ._elementClass ;
85
76
_untyped = base ._untyped ;
86
77
87
78
_elementDeserializer = elemDeser ;
88
79
_elementTypeDeserializer = elemTypeDeser ;
89
- _unwrapSingle = unwrapSingle ;
90
80
}
91
-
81
+
92
82
/**
93
83
* Overridable fluent-factory method used to create contextual instances
94
84
*/
95
85
public ObjectArrayDeserializer withDeserializer (TypeDeserializer elemTypeDeser ,
96
86
JsonDeserializer <?> elemDeser )
97
87
{
98
- return withResolved (elemTypeDeser , elemDeser , _unwrapSingle );
88
+ return withResolved (elemTypeDeser , elemDeser ,
89
+ _nullProvider , _unwrapSingle );
99
90
}
100
91
101
92
/**
102
93
* @since 2.7
103
94
*/
104
95
@ SuppressWarnings ("unchecked" )
105
96
public ObjectArrayDeserializer withResolved (TypeDeserializer elemTypeDeser ,
106
- JsonDeserializer <?> elemDeser , Boolean unwrapSingle )
97
+ JsonDeserializer <?> elemDeser , NullValueProvider nuller , Boolean unwrapSingle )
107
98
{
108
- if ((unwrapSingle == _unwrapSingle )
99
+ if ((unwrapSingle == _unwrapSingle ) && ( nuller == _nullProvider )
109
100
&& (elemDeser == _elementDeserializer )
110
101
&& (elemTypeDeser == _elementTypeDeserializer )) {
111
102
return this ;
112
103
}
113
104
return new ObjectArrayDeserializer (this ,
114
- (JsonDeserializer <Object >) elemDeser , elemTypeDeser , unwrapSingle );
105
+ (JsonDeserializer <Object >) elemDeser , elemTypeDeser ,
106
+ nuller , unwrapSingle );
107
+ }
108
+
109
+ @ Override // since 2.5
110
+ public boolean isCachable () {
111
+ // Important: do NOT cache if polymorphic values, or if there are annotation-based
112
+ // custom deserializers
113
+ return (_elementDeserializer == null ) && (_elementTypeDeserializer == null );
115
114
}
116
115
117
116
@ Override
118
117
public JsonDeserializer <?> createContextual (DeserializationContext ctxt ,
119
118
BeanProperty property ) throws JsonMappingException
120
119
{
121
- JsonDeserializer <?> deser = _elementDeserializer ;
120
+ JsonDeserializer <?> valueDeser = _elementDeserializer ;
122
121
Boolean unwrapSingle = findFormatFeature (ctxt , property , _containerType .getRawClass (),
123
122
JsonFormat .Feature .ACCEPT_SINGLE_VALUE_AS_ARRAY );
124
123
// May have a content converter
125
- deser = findConvertingContentDeserializer (ctxt , property , deser );
124
+ valueDeser = findConvertingContentDeserializer (ctxt , property , valueDeser );
126
125
final JavaType vt = _containerType .getContentType ();
127
- if (deser == null ) {
128
- deser = ctxt .findContextualValueDeserializer (vt , property );
126
+ if (valueDeser == null ) {
127
+ valueDeser = ctxt .findContextualValueDeserializer (vt , property );
129
128
} else { // if directly assigned, probably not yet contextual, so:
130
- deser = ctxt .handleSecondaryContextualization (deser , property , vt );
129
+ valueDeser = ctxt .handleSecondaryContextualization (valueDeser , property , vt );
131
130
}
132
131
TypeDeserializer elemTypeDeser = _elementTypeDeserializer ;
133
132
if (elemTypeDeser != null ) {
134
133
elemTypeDeser = elemTypeDeser .forProperty (property );
135
134
}
136
- return withResolved (elemTypeDeser , deser , unwrapSingle );
137
- }
138
-
139
- @ Override // since 2.5
140
- public boolean isCachable () {
141
- // Important: do NOT cache if polymorphic values, or ones with custom deserializer
142
- return (_elementDeserializer == null ) && (_elementTypeDeserializer == null );
135
+ NullValueProvider nuller = findContentNullProvider (ctxt , property , valueDeser );
136
+ return withResolved (elemTypeDeser , valueDeser , nuller , unwrapSingle );
143
137
}
144
138
145
139
/*
@@ -186,7 +180,7 @@ public Object[] deserialize(JsonParser p, DeserializationContext ctxt)
186
180
Object value ;
187
181
188
182
if (t == JsonToken .VALUE_NULL ) {
189
- value = _elementDeserializer .getNullValue (ctxt );
183
+ value = _nullProvider .getNullValue (ctxt );
190
184
} else if (typeDeser == null ) {
191
185
value = _elementDeserializer .deserialize (p , ctxt );
192
186
} else {
@@ -251,7 +245,7 @@ public Object[] deserialize(JsonParser p, DeserializationContext ctxt,
251
245
Object value ;
252
246
253
247
if (t == JsonToken .VALUE_NULL ) {
254
- value = _elementDeserializer .getNullValue (ctxt );
248
+ value = _nullProvider .getNullValue (ctxt );
255
249
} else if (typeDeser == null ) {
256
250
value = _elementDeserializer .deserialize (p , ctxt );
257
251
} else {
@@ -327,7 +321,7 @@ protected Object[] handleNonArray(JsonParser p, DeserializationContext ctxt)
327
321
Object value ;
328
322
329
323
if (t == JsonToken .VALUE_NULL ) {
330
- value = _elementDeserializer .getNullValue (ctxt );
324
+ value = _nullProvider .getNullValue (ctxt );
331
325
} else if (_elementTypeDeserializer == null ) {
332
326
value = _elementDeserializer .deserialize (p , ctxt );
333
327
} else {
0 commit comments