4
4
import java .util .*;
5
5
6
6
import com .fasterxml .jackson .core .*;
7
-
8
7
import com .fasterxml .jackson .databind .*;
9
8
import com .fasterxml .jackson .databind .deser .ContextualDeserializer ;
10
- import com .fasterxml .jackson .databind .deser .std .StdDeserializer ;
11
9
import com .fasterxml .jackson .databind .jsontype .TypeDeserializer ;
12
10
13
11
/**
14
12
* Deserializer for {@link EnumMap} values.
15
13
* <p>
16
14
* Note: casting within this class is all messed up -- just could not figure out a way
17
15
* to properly deal with recursive definition of "EnumMap<K extends Enum<K>, V>
18
- *
19
- * @author tsaloranta
20
16
*/
21
17
@ SuppressWarnings ({ "unchecked" , "rawtypes" })
22
18
public class EnumMapDeserializer
23
- extends StdDeserializer <EnumMap <?,?>>
19
+ extends ContainerDeserializerBase <EnumMap <?,?>>
24
20
implements ContextualDeserializer
25
21
{
26
22
private static final long serialVersionUID = 4564890642370311174L ;
@@ -47,7 +43,7 @@ public class EnumMapDeserializer
47
43
48
44
public EnumMapDeserializer (JavaType mapType , JsonDeserializer <?> keyDeserializer , JsonDeserializer <?> valueDeser , TypeDeserializer valueTypeDeser )
49
45
{
50
- super (EnumMap . class );
46
+ super (mapType );
51
47
_mapType = mapType ;
52
48
_enumClass = mapType .getKeyType ().getRawClass ();
53
49
_keyDeserializer = (JsonDeserializer <Enum <?>>) keyDeserializer ;
@@ -96,7 +92,23 @@ public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanPro
96
92
*/
97
93
@ Override
98
94
public boolean isCachable () { return true ; }
99
-
95
+
96
+ /*
97
+ /**********************************************************
98
+ /* ContainerDeserializerBase API
99
+ /**********************************************************
100
+ */
101
+
102
+ @ Override
103
+ public JavaType getContentType () {
104
+ return _mapType .getContentType ();
105
+ }
106
+
107
+ @ Override
108
+ public JsonDeserializer <Object > getContentDeserializer () {
109
+ return _valueDeserializer ;
110
+ }
111
+
100
112
/*
101
113
/**********************************************************
102
114
/* Actual deserialization
@@ -115,6 +127,8 @@ public EnumMap<?,?> deserialize(JsonParser jp, DeserializationContext ctxt) thro
115
127
final TypeDeserializer typeDeser = _valueTypeDeserializer ;
116
128
117
129
while ((jp .nextToken ()) != JsonToken .END_OBJECT ) {
130
+ String keyName = jp .getCurrentName (); // just for error message
131
+ // but we need to let key deserializer handle it separately, nonetheless
118
132
Enum <?> key = _keyDeserializer .deserialize (jp , ctxt );
119
133
if (key == null ) {
120
134
if (!ctxt .isEnabled (DeserializationFeature .READ_UNKNOWN_ENUM_VALUES_AS_NULL )) {
@@ -127,7 +141,7 @@ public EnumMap<?,?> deserialize(JsonParser jp, DeserializationContext ctxt) thro
127
141
throw ctxt .weirdStringException (value , _enumClass , "value not one of declared Enum instance names" );
128
142
}
129
143
/* 24-Mar-2012, tatu: Null won't work as a key anyway, so let's
130
- * just skip the entry then. But we must skip the value then .
144
+ * just skip the entry then. But we must skip the value as well, if so .
131
145
*/
132
146
jp .nextToken ();
133
147
jp .skipChildren ();
@@ -139,13 +153,18 @@ public EnumMap<?,?> deserialize(JsonParser jp, DeserializationContext ctxt) thro
139
153
* not handle them (and maybe fail or return bogus data)
140
154
*/
141
155
Object value ;
142
-
143
- if (t == JsonToken .VALUE_NULL ) {
144
- value = valueDes .getNullValue ();
145
- } else if (typeDeser == null ) {
146
- value = valueDes .deserialize (jp , ctxt );
147
- } else {
148
- value = valueDes .deserializeWithType (jp , ctxt , typeDeser );
156
+
157
+ try {
158
+ if (t == JsonToken .VALUE_NULL ) {
159
+ value = valueDes .getNullValue ();
160
+ } else if (typeDeser == null ) {
161
+ value = valueDes .deserialize (jp , ctxt );
162
+ } else {
163
+ value = valueDes .deserializeWithType (jp , ctxt , typeDeser );
164
+ }
165
+ } catch (Exception e ) {
166
+ wrapAndThrow (e , result , keyName );
167
+ return null ;
149
168
}
150
169
result .put (key , value );
151
170
}
0 commit comments