diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-06-30 16:19:19 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-06-30 16:19:19 -0700 |
commit | d8ca1c2d1c03ff1e3e64d027e84d6130ea9e45c4 (patch) | |
tree | 17221822a38dcb9b975455c299e05b449a0bd77f /src/main/java | |
parent | 643772b1af7dc5cab15582ae8d2dbc5f9bdf548a (diff) | |
download | jackson-databind-d8ca1c2d1c03ff1e3e64d027e84d6130ea9e45c4.tar.gz |
Add scalar-extraction support for EnumDeserializer as well
Diffstat (limited to 'src/main/java')
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java index c918c0684..ae0957251 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumDeserializer.java @@ -173,21 +173,15 @@ public class EnumDeserializer @Override public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + String text; JsonToken curr = p.currentToken(); // Usually should just get string value: if (curr == JsonToken.VALUE_STRING || curr == JsonToken.FIELD_NAME) { - CompactStringObjectMap lookup = ctxt.isEnabled(DeserializationFeature.READ_ENUMS_USING_TO_STRING) - ? _getToStringLookup(ctxt) : _lookupByName; - final String name = p.getText(); - Object result = lookup.find(name); - if (result == null) { - return _deserializeAltString(p, ctxt, lookup, name); - } - return result; - } + text = p.getText(); + // But let's consider int acceptable as well (if within ordinal range) - if (curr == JsonToken.VALUE_NUMBER_INT) { + } else if (curr == JsonToken.VALUE_NUMBER_INT) { // ... unless told not to do that int index = p.getIntValue(); if (ctxt.isEnabled(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS)) { @@ -208,8 +202,23 @@ public class EnumDeserializer _enumsByIndex.length-1); } return null; + } else if (curr == JsonToken.START_OBJECT) { + // 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML) + text = ctxt.extractScalarFromObject(p, this, _valueClass); + } else { + return _deserializeOther(p, ctxt); + } + + CompactStringObjectMap lookup = ctxt.isEnabled(DeserializationFeature.READ_ENUMS_USING_TO_STRING) + ? _getToStringLookup(ctxt) : _lookupByName; + Object result = lookup.find(text); + if (result == null) { + String trimmed = text.trim(); + if ((trimmed == text) || (result = lookup.find(trimmed)) == null) { + return _deserializeAltString(p, ctxt, lookup, trimmed); + } } - return _deserializeOther(p, ctxt); + return result; } /* |