diff options
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java')
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java | 62 |
1 files changed, 29 insertions, 33 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java index b99f66968..cba73fb4a 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java @@ -15,10 +15,11 @@ import com.fasterxml.jackson.databind.deser.impl.PropertyValueBuffer; import com.fasterxml.jackson.databind.deser.impl.ReadableObjectId.Referring; import com.fasterxml.jackson.databind.introspect.AnnotatedMember; import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; +import com.fasterxml.jackson.databind.type.LogicalType; import com.fasterxml.jackson.databind.util.ArrayBuilders; /** - * Basic serializer that can take JSON "Object" structure and + * Basic deserializer that can take JSON "Object" structure and * construct a {@link java.util.Map} instance, with typed contents. *<p> * Note: for untyped content (one indicated by passing Object.class @@ -333,6 +334,11 @@ public class MapDeserializer && (_ignorableProperties == null); } + @Override // since 2.12 + public LogicalType logicalType() { + return LogicalType.Map; + } + @Override @SuppressWarnings("unchecked") public Map<Object,Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException @@ -349,36 +355,26 @@ public class MapDeserializer getValueInstantiator(), p, "no default constructor found"); } - // Ok: must point to START_OBJECT, FIELD_NAME or END_OBJECT - JsonToken t = p.getCurrentToken(); - if (t != JsonToken.START_OBJECT && t != JsonToken.FIELD_NAME && t != JsonToken.END_OBJECT) { - // (empty) String may be ok however; or single-String-arg ctor - if (t == JsonToken.VALUE_STRING) { - return (Map<Object,Object>) _valueInstantiator.createFromString(ctxt, p.getText()); + switch (p.currentTokenId()) { + case JsonTokenId.ID_START_OBJECT: + case JsonTokenId.ID_END_OBJECT: + case JsonTokenId.ID_FIELD_NAME: + final Map<Object,Object> result = (Map<Object,Object>) _valueInstantiator.createUsingDefault(ctxt); + if (_standardStringKey) { + _readAndBindStringKeyMap(p, ctxt, result); + return result; } - if (t == JsonToken.START_ARRAY) { - if (p.nextToken() == JsonToken.END_ARRAY) { - if (ctxt.isEnabled(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT)) { - return null; - } - } else if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) { - final Object value = deserialize(p, ctxt); - if (p.nextToken() != JsonToken.END_ARRAY) { - handleMissingEndArrayForSingle(p, ctxt); - } - return (Map<Object,Object>) value; - } - // fall through to failing case - } - return (Map<Object,Object>) ctxt.handleUnexpectedToken(getValueType(ctxt), t, p, null); - } - final Map<Object,Object> result = (Map<Object,Object>) _valueInstantiator.createUsingDefault(ctxt); - if (_standardStringKey) { - _readAndBindStringKeyMap(p, ctxt, result); + _readAndBind(p, ctxt, result); return result; + case JsonTokenId.ID_STRING: + // (empty) String may be ok however; or single-String-arg ctor + return _deserializeFromString(p, ctxt); + case JsonTokenId.ID_START_ARRAY: + // Empty array, or single-value wrapped in array? + return _deserializeFromArray(p, ctxt); + default: } - _readAndBind(p, ctxt, result); - return result; + return (Map<Object,Object>) ctxt.handleUnexpectedToken(getValueType(ctxt), p); } @SuppressWarnings("unchecked") @@ -391,7 +387,7 @@ public class MapDeserializer p.setCurrentValue(result); // Ok: must point to START_OBJECT or FIELD_NAME - JsonToken t = p.getCurrentToken(); + JsonToken t = p.currentToken(); if (t != JsonToken.START_OBJECT && t != JsonToken.FIELD_NAME) { return (Map<Object,Object>) ctxt.handleUnexpectedToken(getMapClass(), p); } @@ -448,7 +444,7 @@ public class MapDeserializer if (p.isExpectedStartObjectToken()) { keyStr = p.nextFieldName(); } else { - JsonToken t = p.getCurrentToken(); + JsonToken t = p.currentToken(); if (t != JsonToken.FIELD_NAME) { if (t == JsonToken.END_OBJECT) { return; @@ -512,7 +508,7 @@ public class MapDeserializer if (p.isExpectedStartObjectToken()) { key = p.nextFieldName(); } else { - JsonToken t = p.getCurrentToken(); + JsonToken t = p.currentToken(); if (t == JsonToken.END_OBJECT) { return; } @@ -651,7 +647,7 @@ public class MapDeserializer if (p.isExpectedStartObjectToken()) { keyStr = p.nextFieldName(); } else { - JsonToken t = p.getCurrentToken(); + JsonToken t = p.currentToken(); if (t == JsonToken.END_OBJECT) { return; } @@ -720,7 +716,7 @@ public class MapDeserializer if (p.isExpectedStartObjectToken()) { key = p.nextFieldName(); } else { - JsonToken t = p.getCurrentToken(); + JsonToken t = p.currentToken(); if (t == JsonToken.END_OBJECT) { return; } |