aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2020-06-29 16:23:03 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2020-06-29 16:23:03 -0700
commit52ee6f0272deb426e4969ec4ab1de811db4fffa1 (patch)
tree74c5428eed166435ec4e0dc0b7df00841a84bd6c /src/main/java/com/fasterxml
parent3d256f1630913919033fa22ce84fb9fa42bc719f (diff)
downloadjackson-databind-52ee6f0272deb426e4969ec4ab1de811db4fffa1.tar.gz
Last refactoring wrt `DeserializationContext.extractScalarFromObject()`, tests
Diffstat (limited to 'src/main/java/com/fasterxml')
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java14
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java2
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java7
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();
}