@@ -23,31 +23,32 @@ 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 );
45
- } else {
46
- value = valueDes .deserializeWithType (jp , ctxt , typeDeser );
43
+ _handleNull (ctxt , fieldName , _valueDeserializer , builder );
44
+ continue ;
47
45
}
48
- if (null != value ) {
49
- builder .put (key , value );
46
+ if (typeDeser == null ) {
47
+ value = valueDes .deserialize (p , ctxt );
48
+ } else {
49
+ value = valueDes .deserializeWithType (p , ctxt , typeDeser );
50
50
}
51
+ builder .put (key , value );
51
52
}
52
53
// No class outside of the package will be able to subclass us,
53
54
// and we provide the proper builder for the subclasses we implement.
@@ -56,4 +57,23 @@ protected T _deserializeEntries(JsonParser jp, DeserializationContext ctxt) thro
56
57
return map ;
57
58
}
58
59
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
+ }
59
79
}
0 commit comments