aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java
diff options
context:
space:
mode:
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.java47
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