diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2017-03-30 22:24:39 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2017-03-30 22:24:39 -0700 |
commit | 0e7e87cd7cb7d9861b936d4d8338cd13a76f855c (patch) | |
tree | 2918d204f59e043d1ec431badda55fe03d35e137 | |
parent | 16ab9246c7d5f989b4f615b73aa0e94aff0e7d18 (diff) | |
download | jackson-databind-0e7e87cd7cb7d9861b936d4d8338cd13a76f855c.tar.gz |
...
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java | 52 | ||||
-rw-r--r-- | src/test/java/com/fasterxml/jackson/databind/struct/ScalarCoercionTest.java | 10 |
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); */ } |