diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-06-29 16:23:03 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-06-29 16:23:03 -0700 |
commit | 52ee6f0272deb426e4969ec4ab1de811db4fffa1 (patch) | |
tree | 74c5428eed166435ec4e0dc0b7df00841a84bd6c /src/main/java/com/fasterxml | |
parent | 3d256f1630913919033fa22ce84fb9fa42bc719f (diff) | |
download | jackson-databind-52ee6f0272deb426e4969ec4ab1de811db4fffa1.tar.gz |
Last refactoring wrt `DeserializationContext.extractScalarFromObject()`, tests
Diffstat (limited to 'src/main/java/com/fasterxml')
3 files changed, 16 insertions, 7 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java b/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java index 1004defb8..29c93fdbb 100644 --- a/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java +++ b/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java @@ -854,8 +854,10 @@ public abstract class DeserializationContext * "simple" unstructured value type. * * @param p Actual parser to read content from - * @param ctxt Deserialization context * @param deser Deserializer that needs extracted String value + * @param scalarType Immediate type of scalar to extract; usually type deserializer + * handles but not always (for example, deserializer for {@code int[]} would pass + * scalar type of {@code int}) * * @return String value found; not {@code null} (exception should be thrown if no suitable * value found) @@ -863,11 +865,13 @@ public abstract class DeserializationContext * @throws IOException If there are problems either reading content (underlying parser * problem) or finding expected scalar value */ - public String extractScalarFromObject(JsonParser p, DeserializationContext ctxt, - JsonDeserializer<?> deser) + public String extractScalarFromObject(JsonParser p, JsonDeserializer<?> deser, + Class<?> scalarType) throws IOException { - return null; + return reportInputMismatch(scalarType, String.format( +"Cannot deserialize value of type %s from %s (token `JsonToken.START_OBJECT`)", +ClassUtil.getClassDescription(scalarType), _shapeForToken(JsonToken.START_OBJECT))); } /* @@ -1350,7 +1354,7 @@ public abstract class DeserializationContext } reportBadDefinition(targetType, String.format( "DeserializationProblemHandler.handleUnexpectedToken() for type %s returned value of type %s", - ClassUtil.getClassDescription(targetType), + ClassUtil.getTypeDescription(targetType), ClassUtil.classNameOf(instance) )); } 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 3a7780391..4020623d1 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 @@ -535,7 +535,7 @@ public class NumberDeserializers { String text; switch (p.currentTokenId()) { - case JsonTokenId.ID_STRING: // let's do implicit re-parse + case JsonTokenId.ID_STRING: text = p.getText(); break; case JsonTokenId.ID_NUMBER_FLOAT: // coercing may work too 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 7b02c6986..2300fa047 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 @@ -674,6 +674,12 @@ 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 + case JsonTokenId.ID_START_OBJECT: + text = ctxt.extractScalarFromObject(p, this, Integer.TYPE); + break; case JsonTokenId.ID_START_ARRAY: if (ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) { p.nextToken(); @@ -683,7 +689,6 @@ public abstract class StdDeserializer<T> } // fall through to fail default: - // Otherwise, no can do: return ((Number) ctxt.handleUnexpectedToken(Integer.TYPE, p)).intValue(); } |