@@ -23,27 +23,30 @@ abstract class GuavaImmutableMapDeserializer<T extends ImmutableMap<Object, Obje
23
23
protected abstract ImmutableMap .Builder <Object , Object > createBuilder ();
24
24
25
25
@ Override
26
- protected T _deserializeEntries (JsonParser jp , DeserializationContext ctxt ) throws IOException ,
27
- JsonProcessingException {
26
+ protected T _deserializeEntries (JsonParser p , DeserializationContext ctxt )
27
+ throws IOException , JsonProcessingException
28
+ {
28
29
final KeyDeserializer keyDes = _keyDeserializer ;
29
30
final JsonDeserializer <?> valueDes = _valueDeserializer ;
30
31
final TypeDeserializer typeDeser = _typeDeserializerForValue ;
31
32
32
33
ImmutableMap .Builder <Object , Object > builder = createBuilder ();
33
- for (; jp .getCurrentToken () == JsonToken .FIELD_NAME ; jp .nextToken ()) {
34
+ for (; p .getCurrentToken () == JsonToken .FIELD_NAME ; p .nextToken ()) {
34
35
// Must point to field name now
35
- String fieldName = jp .getCurrentName ();
36
+ String fieldName = p .getCurrentName ();
36
37
Object key = (keyDes == null ) ? fieldName : keyDes .deserializeKey (fieldName , ctxt );
37
38
// And then the value...
38
- JsonToken t = jp .nextToken ();
39
+ JsonToken t = p .nextToken ();
39
40
// 28-Nov-2010, tatu: Should probably support "ignorable properties" in future...
40
41
Object value ;
41
42
if (t == JsonToken .VALUE_NULL ) {
42
- value = null ;
43
- } else if (typeDeser == null ) {
44
- value = valueDes .deserialize (jp , ctxt );
43
+ _handleNull (ctxt , fieldName , _valueDeserializer , builder );
44
+ continue ;
45
+ }
46
+ if (typeDeser == null ) {
47
+ value = valueDes .deserialize (p , ctxt );
45
48
} else {
46
- value = valueDes .deserializeWithType (jp , ctxt , typeDeser );
49
+ value = valueDes .deserializeWithType (p , ctxt , typeDeser );
47
50
}
48
51
builder .put (key , value );
49
52
}
@@ -54,4 +57,23 @@ protected T _deserializeEntries(JsonParser jp, DeserializationContext ctxt) thro
54
57
return map ;
55
58
}
56
59
57
- }
60
+ /**
61
+ * Overridable helper method called when a JSON null value is encountered.
62
+ * Since Guava Maps typically do not allow null values, special handling
63
+ * is needed; default is to simply ignore and skip such values, but alternative
64
+ * could be to throw an exception.
65
+ */
66
+ protected void _handleNull (DeserializationContext ctxt , String fieldName ,
67
+ JsonDeserializer <?> valueDeser ,
68
+ ImmutableMap .Builder <Object , Object > builder ) throws IOException
69
+ {
70
+ // 14-Sep-2015, tatu: As per [datatype-guava#52], avoid exception due to null
71
+ // TODO: allow reporting problem via a feature, in future?
72
+
73
+ // Actually, first, see if there's an alternative to Java null
74
+ Object nvl = valueDeser .getNullValue (ctxt );
75
+ if (nvl != null ) {
76
+ builder .put (fieldName , nvl );
77
+ }
78
+ }
79
+ }
0 commit comments