diff options
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java')
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java index a82b945f8..ced28f0a9 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java @@ -5,6 +5,7 @@ import java.util.*; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.cfg.CoercionAction; import com.fasterxml.jackson.databind.deser.impl.*; import com.fasterxml.jackson.databind.deser.impl.ReadableObjectId.Referring; import com.fasterxml.jackson.databind.util.NameTransformer; @@ -163,7 +164,7 @@ public class BeanDeserializer } return deserializeFromObject(p, ctxt); } - return _deserializeOther(p, ctxt, p.getCurrentToken()); + return _deserializeOther(p, ctxt, p.currentToken()); } protected final Object _deserializeOther(JsonParser p, DeserializationContext ctxt, @@ -398,7 +399,7 @@ public class BeanDeserializer TokenBuffer unknown = null; final Class<?> activeView = _needViewProcesing ? ctxt.getActiveView() : null; - JsonToken t = p.getCurrentToken(); + JsonToken t = p.currentToken(); List<BeanReferring> referrings = null; for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) { String propName = p.getCurrentName(); @@ -583,23 +584,29 @@ public class BeanDeserializer } return bean; } - if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) { - JsonToken t = p.nextToken(); - if (t == JsonToken.END_ARRAY && ctxt.isEnabled(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT)) { - return null; - } - final Object value = deserialize(p, ctxt); - if (p.nextToken() != JsonToken.END_ARRAY) { - handleMissingEndArrayForSingle(p, ctxt); - } - return value; - } - if (ctxt.isEnabled(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT)) { + final CoercionAction act = _findCoercionFromEmptyArray(ctxt); + final boolean unwrap = ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS); + + if (unwrap || (act != CoercionAction.Fail)) { JsonToken t = p.nextToken(); if (t == JsonToken.END_ARRAY) { - return null; + switch (act) { + case AsEmpty: + return getEmptyValue(ctxt); + case AsNull: + case TryConvert: + return getNullValue(ctxt); + default: + } + return ctxt.handleUnexpectedToken(getValueType(ctxt), JsonToken.START_ARRAY, p, null); + } + if (unwrap) { + final Object value = deserialize(p, ctxt); + if (p.nextToken() != JsonToken.END_ARRAY) { + handleMissingEndArrayForSingle(p, ctxt); + } + return value; } - return ctxt.handleUnexpectedToken(getValueType(ctxt), JsonToken.START_ARRAY, p, null); } return ctxt.handleUnexpectedToken(getValueType(ctxt), p); } @@ -721,7 +728,7 @@ public class BeanDeserializer Object bean) throws IOException { - JsonToken t = p.getCurrentToken(); + JsonToken t = p.currentToken(); if (t == JsonToken.START_OBJECT) { t = p.nextToken(); } @@ -788,7 +795,7 @@ public class BeanDeserializer TokenBuffer tokens = new TokenBuffer(p, ctxt); tokens.writeStartObject(); - JsonToken t = p.getCurrentToken(); + JsonToken t = p.currentToken(); for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) { String propName = p.getCurrentName(); p.nextToken(); // to point to value @@ -914,7 +921,7 @@ public class BeanDeserializer final Class<?> activeView = _needViewProcesing ? ctxt.getActiveView() : null; final ExternalTypeHandler ext = _externalTypeIdHandler.start(); - for (JsonToken t = p.getCurrentToken(); t == JsonToken.FIELD_NAME; t = p.nextToken()) { + for (JsonToken t = p.currentToken(); t == JsonToken.FIELD_NAME; t = p.nextToken()) { String propName = p.getCurrentName(); t = p.nextToken(); SettableBeanProperty prop = _beanProperties.find(propName); @@ -970,7 +977,7 @@ public class BeanDeserializer TokenBuffer tokens = new TokenBuffer(p, ctxt); tokens.writeStartObject(); - JsonToken t = p.getCurrentToken(); + JsonToken t = p.currentToken(); for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) { String propName = p.getCurrentName(); p.nextToken(); // to point to value |