aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java
diff options
context:
space:
mode:
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.java62
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;
}