diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-06-29 16:53:30 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-06-29 16:53:30 -0700 |
commit | 7b9e7ddec3722b4b97dff76d41b3cbaa4685e577 (patch) | |
tree | f59ef58d5bf73a00440089b2303c1e6f9de26985 /src/main/java/com/fasterxml | |
parent | 52ee6f0272deb426e4969ec4ab1de811db4fffa1 (diff) | |
download | jackson-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.java | 53 | ||||
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java | 41 |
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; |