aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2020-06-29 16:53:30 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2020-06-29 16:53:30 -0700
commit7b9e7ddec3722b4b97dff76d41b3cbaa4685e577 (patch)
treef59ef58d5bf73a00440089b2303c1e6f9de26985 /src/main/java/com/fasterxml
parent52ee6f0272deb426e4969ec4ab1de811db4fffa1 (diff)
downloadjackson-databind-7b9e7ddec3722b4b97dff76d41b3cbaa4685e577.tar.gz
Complete adding "scalar-from-Object" for all basic scalar types
Diffstat (limited to 'src/main/java/com/fasterxml')
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java53
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java41
2 files changed, 86 insertions, 8 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java
index 4020623d1..2088fbca2 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java
@@ -297,6 +297,10 @@ public class NumberDeserializers
return p.getByteValue();
case JsonTokenId.ID_START_ARRAY:
return (Byte) _deserializeFromArray(p, ctxt);
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
default:
return (Byte) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
}
@@ -379,11 +383,16 @@ public class NumberDeserializers
return (Short) getNullValue(ctxt);
case JsonTokenId.ID_NUMBER_INT:
return p.getShortValue();
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return (Short)_deserializeFromArray(p, ctxt);
default:
return (Short) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
}
+
// Rest of the processing is for coercion from String
final CoercionAction act = _checkFromStringCoercion(ctxt, text);
if (act == CoercionAction.AsNull) {
@@ -463,11 +472,16 @@ public class NumberDeserializers
_verifyNullForPrimitive(ctxt);
}
return (Character) getNullValue(ctxt);
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return _deserializeFromArray(p, ctxt);
default:
return (Character) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
}
+
if (text.length() == 1) {
return Character.valueOf(text.charAt(0));
}
@@ -551,6 +565,10 @@ public class NumberDeserializers
return p.getIntValue();
case JsonTokenId.ID_NULL: // null fine for non-primitive
return (Integer) getNullValue(ctxt);
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return (Integer) _deserializeFromArray(p, ctxt);
default:
@@ -621,6 +639,10 @@ public class NumberDeserializers
return (Long) getNullValue(ctxt);
case JsonTokenId.ID_NUMBER_INT:
return p.getLongValue();
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return (Long) _deserializeFromArray(p, ctxt);
default:
@@ -681,11 +703,16 @@ public class NumberDeserializers
case JsonTokenId.ID_NUMBER_FLOAT:
case JsonTokenId.ID_NUMBER_INT: // safe coercion
return p.getFloatValue();
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return _deserializeFromArray(p, ctxt);
default:
- return (Float) ctxt.handleUnexpectedToken(_valueClass, p);
+ return (Float) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
}
+
final CoercionAction act = _checkFromStringCoercion(ctxt, text);
if (act == CoercionAction.AsNull) {
return (Float) getNullValue(ctxt);
@@ -773,10 +800,14 @@ public class NumberDeserializers
case JsonTokenId.ID_NUMBER_FLOAT:
case JsonTokenId.ID_NUMBER_INT: // safe coercion
return p.getDoubleValue();
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return _deserializeFromArray(p, ctxt);
default:
- return (Double) ctxt.handleUnexpectedToken(_valueClass, p);
+ return (Double) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
}
// Coercion from String most complicated
@@ -865,10 +896,14 @@ public class NumberDeserializers
}
}
return p.getNumberValue();
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return _deserializeFromArray(p, ctxt);
default:
- return ctxt.handleUnexpectedToken(_valueClass, p);
+ return ctxt.handleUnexpectedToken(getValueType(ctxt), p);
}
// Textual values are more difficult... not parsing itself, but figuring
@@ -989,11 +1024,15 @@ public class NumberDeserializers
return (BigInteger) getEmptyValue(ctxt);
}
return p.getDecimalValue().toBigInteger();
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return _deserializeFromArray(p, ctxt);
default:
// String is ok too, can easily convert; otherwise, no can do:
- return (BigInteger) ctxt.handleUnexpectedToken(_valueClass, p);
+ return (BigInteger) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
}
final CoercionAction act = _checkFromStringCoercion(ctxt, text);
@@ -1047,10 +1086,14 @@ public class NumberDeserializers
case JsonTokenId.ID_STRING:
text = p.getText();
break;
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return _deserializeFromArray(p, ctxt);
default:
- return (BigDecimal) ctxt.handleUnexpectedToken(_valueClass, p);
+ return (BigDecimal) ctxt.handleUnexpectedToken(getValueType(ctxt), p);
}
final CoercionAction act = _checkFromStringCoercion(ctxt, text);
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java
index 2300fa047..7c77fc057 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java
@@ -387,6 +387,10 @@ public abstract class StdDeserializer<T>
case JsonTokenId.ID_NULL: // null fine for non-primitive
_verifyNullForPrimitive(ctxt);
return false;
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, Boolean.TYPE);
+ break;
case JsonTokenId.ID_START_ARRAY:
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
@@ -491,6 +495,10 @@ public abstract class StdDeserializer<T>
return false;
case JsonTokenId.ID_NULL: // null fine for non-primitive
return null;
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, targetType);
+ break;
case JsonTokenId.ID_START_ARRAY: // unwrapping / from-empty-array coercion?
return (Boolean) _deserializeFromArray(p, ctxt);
default:
@@ -548,6 +556,10 @@ public abstract class StdDeserializer<T>
case JsonTokenId.ID_NULL:
_verifyNullForPrimitive(ctxt);
return (byte) 0;
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, Byte.TYPE);
+ break;
case JsonTokenId.ID_START_ARRAY: // unwrapping / from-empty-array coercion?
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
@@ -612,6 +624,10 @@ public abstract class StdDeserializer<T>
case JsonTokenId.ID_NULL:
_verifyNullForPrimitive(ctxt);
return (short) 0;
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, Short.TYPE);
+ break;
case JsonTokenId.ID_START_ARRAY:
// 12-Jun-2020, tatu: For some reason calling `_deserializeFromArray()` won't work so:
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
@@ -674,9 +690,7 @@ public abstract class StdDeserializer<T>
case JsonTokenId.ID_NULL:
_verifyNullForPrimitive(ctxt);
return 0;
-
- // 29-Jun-2020, tatu: New! "Scalar from Object" to support tricky case of
- // XML element with attributes
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
case JsonTokenId.ID_START_OBJECT:
text = ctxt.extractScalarFromObject(p, this, Integer.TYPE);
break;
@@ -754,6 +768,10 @@ public abstract class StdDeserializer<T>
case JsonTokenId.ID_NULL:
_verifyNullForPrimitive(ctxt);
return 0L;
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, Long.TYPE);
+ break;
case JsonTokenId.ID_START_ARRAY:
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
p.nextToken();
@@ -811,6 +829,10 @@ public abstract class StdDeserializer<T>
case JsonTokenId.ID_NULL:
_verifyNullForPrimitive(ctxt);
return 0f;
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, Float.TYPE);
+ break;
case JsonTokenId.ID_START_ARRAY:
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
p.nextToken();
@@ -882,6 +904,10 @@ public abstract class StdDeserializer<T>
case JsonTokenId.ID_NULL:
_verifyNullForPrimitive(ctxt);
return 0.0;
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, Double.TYPE);
+ break;
case JsonTokenId.ID_START_ARRAY:
if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) {
p.nextToken();
@@ -978,6 +1004,10 @@ public abstract class StdDeserializer<T>
}
case JsonTokenId.ID_NULL:
return (java.util.Date) getNullValue(ctxt);
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ case JsonTokenId.ID_START_OBJECT:
+ text = ctxt.extractScalarFromObject(p, this, _valueClass);
+ break;
case JsonTokenId.ID_START_ARRAY:
return _parseDateFromArray(p, ctxt);
default:
@@ -1068,6 +1098,11 @@ public abstract class StdDeserializer<T>
// otherwise, try conversion using toString()...
return ob.toString();
}
+ // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
+ if (p.hasToken(JsonToken.START_OBJECT)) {
+ return ctxt.extractScalarFromObject(p, this, _valueClass);
+ }
+
String value = p.getValueAsString();
if (value != null) {
return value;