aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2017-03-30 22:24:39 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2017-03-30 22:24:39 -0700
commit0e7e87cd7cb7d9861b936d4d8338cd13a76f855c (patch)
tree2918d204f59e043d1ec431badda55fe03d35e137
parent16ab9246c7d5f989b4f615b73aa0e94aff0e7d18 (diff)
downloadjackson-databind-0e7e87cd7cb7d9861b936d4d8338cd13a76f855c.tar.gz
...
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java52
-rw-r--r--src/test/java/com/fasterxml/jackson/databind/struct/ScalarCoercionTest.java10
2 files changed, 46 insertions, 16 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 01cedce7c..ab07a99d6 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
@@ -187,9 +187,16 @@ public class NumberDeserializers
}
@Override
- public Boolean deserialize(JsonParser j, DeserializationContext ctxt) throws IOException
+ public Boolean deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
{
- return _parseBoolean(j, ctxt);
+ JsonToken t = p.getCurrentToken();
+ if (t == JsonToken.VALUE_TRUE) {
+ return Boolean.TRUE;
+ }
+ if (t == JsonToken.VALUE_FALSE) {
+ return Boolean.FALSE;
+ }
+ return _parseBoolean(p, ctxt);
}
// Since we can never have type info ("natural type"; String, Boolean, Integer, Double):
@@ -199,6 +206,13 @@ public class NumberDeserializers
TypeDeserializer typeDeserializer)
throws IOException
{
+ JsonToken t = p.getCurrentToken();
+ if (t == JsonToken.VALUE_TRUE) {
+ return Boolean.TRUE;
+ }
+ if (t == JsonToken.VALUE_FALSE) {
+ return Boolean.FALSE;
+ }
return _parseBoolean(p, ctxt);
}
@@ -206,19 +220,19 @@ public class NumberDeserializers
throws IOException
{
JsonToken t = p.getCurrentToken();
- if (t == JsonToken.VALUE_TRUE) {
- return Boolean.TRUE;
+ if (t == JsonToken.VALUE_NULL) {
+ return (Boolean) _coerceNullToken(ctxt, _primitive);
}
- if (t == JsonToken.VALUE_FALSE) {
- return Boolean.FALSE;
+ if (t == JsonToken.START_ARRAY) { // unwrapping?
+ return _deserializeFromArray(p, ctxt);
}
+
+// final boolean canCoerce = ctxt.isEnabled(DeserializationFeature.ALLOW_COERCION_FOR_SCALARS);
+
// should accept ints too, (0 == false, otherwise true)
if (t == JsonToken.VALUE_NUMBER_INT) {
return Boolean.valueOf(_parseBooleanFromInt(p, ctxt));
}
- if (t == JsonToken.VALUE_NULL) {
- return (Boolean) _coerceNullToken(ctxt, _primitive);
- }
// And finally, let's allow Strings to be converted too
if (t == JsonToken.VALUE_STRING) {
String text = p.getText().trim();
@@ -233,14 +247,17 @@ public class NumberDeserializers
return (Boolean) _coerceEmptyString(ctxt, _primitive);
}
if (_hasTextualNull(text)) {
- return (Boolean) _coerceTextualNull(ctxt, _primitive);
+ return (Boolean) _coerceTextualNull(ctxt, _primitive);
}
return (Boolean) ctxt.handleWeirdStringValue(_valueClass, text,
"only \"true\" or \"false\" recognized");
}
- // [databind#381]
- if (t == JsonToken.START_ARRAY) {
- return _deserializeFromArray(p, ctxt);
+ // usually caller should have handled but:
+ if (t == JsonToken.VALUE_TRUE) {
+ return Boolean.TRUE;
+ }
+ if (t == JsonToken.VALUE_FALSE) {
+ return Boolean.FALSE;
}
// Otherwise, no can do:
return (Boolean) ctxt.handleUnexpectedToken(_valueClass, p);
@@ -264,15 +281,15 @@ public class NumberDeserializers
@Override
public Byte deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
{
+ if (p.hasToken(JsonToken.VALUE_NUMBER_INT)) {
+ return p.getByteValue();
+ }
return _parseByte(p, ctxt);
}
protected Byte _parseByte(JsonParser p, DeserializationContext ctxt) throws IOException
{
JsonToken t = p.getCurrentToken();
- if (t == JsonToken.VALUE_NUMBER_INT) {
- return p.getByteValue();
- }
if (t == JsonToken.VALUE_STRING) { // let's do implicit re-parse
String text = p.getText().trim();
if (_hasTextualNull(text)) {
@@ -311,6 +328,9 @@ public class NumberDeserializers
if (t == JsonToken.START_ARRAY) {
return _deserializeFromArray(p, ctxt);
}
+ if (t == JsonToken.VALUE_NUMBER_INT) { // shouldn't usually be called with it but
+ return p.getByteValue();
+ }
return (Byte) ctxt.handleUnexpectedToken(_valueClass, p);
}
}
diff --git a/src/test/java/com/fasterxml/jackson/databind/struct/ScalarCoercionTest.java b/src/test/java/com/fasterxml/jackson/databind/struct/ScalarCoercionTest.java
index 224a7a029..de2ca1898 100644
--- a/src/test/java/com/fasterxml/jackson/databind/struct/ScalarCoercionTest.java
+++ b/src/test/java/com/fasterxml/jackson/databind/struct/ScalarCoercionTest.java
@@ -25,13 +25,23 @@ public class ScalarCoercionTest extends BaseMapTest
// first successful coercions
_verifyCoerceSuccess("1", Boolean.TYPE, Boolean.TRUE);
_verifyCoerceSuccess("1", Boolean.class, Boolean.TRUE);
+ _verifyCoerceSuccess(quote("true"), Boolean.TYPE, Boolean.TRUE);
+ _verifyCoerceSuccess(quote("true"), Boolean.class, Boolean.TRUE);
+ _verifyCoerceSuccess(quote("True"), Boolean.TYPE, Boolean.TRUE);
+ _verifyCoerceSuccess(quote("True"), Boolean.class, Boolean.TRUE);
_verifyCoerceSuccess("0", Boolean.TYPE, Boolean.FALSE);
_verifyCoerceSuccess("0", Boolean.class, Boolean.FALSE);
+ _verifyCoerceSuccess(quote("false"), Boolean.TYPE, Boolean.FALSE);
+ _verifyCoerceSuccess(quote("false"), Boolean.class, Boolean.FALSE);
+ _verifyCoerceSuccess(quote("False"), Boolean.TYPE, Boolean.FALSE);
+ _verifyCoerceSuccess(quote("False"), Boolean.class, Boolean.FALSE);
// and then expected fails
/*
_verifyCoerceFail("1", Boolean.TYPE);
_verifyCoerceFail("1", Boolean.class);
+ _verifyCoerceFail(quote("true"), Boolean.TYPE);
+ _verifyCoerceFail(quote("true"), Boolean.class);
*/
}