Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem with enums, @JsonProperty, numbers-as-Strings property name #1626

Closed
cowtowncoder opened this issue May 16, 2017 · 7 comments
Closed

Comments

@cowtowncoder
Copy link
Member

(reported on mailing list)

It appears that use of naming like:

public enum Nums {
   @JsonProperty("1")
    first
    ;
}

does not work as expected, possibly due to number auto-detection for Enum deserialization.

@YuriIvanov
Copy link

YuriIvanov commented May 17, 2017

The problem may lay deeper.
I have used mapper in this way

responseMapper.readValue(
       response.asString(),
       new TypeReference<JsonResponseEnvelope<List<ShippingMethodInfo>>>() { });

Here is JsonResponseEnvelope itself

/**
 * Envelope for json response from .NET WebMethods.
 * When WebMethod returns some data it is always envelopes it in JSON object with .d field.
 *
 * @param <T> Type of .d field.
 */
public class JsonResponseEnvelope<T> {
    @JsonProperty("d")
    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

@YuriIvanov
Copy link

I afraid we need to fully reproduce my situation. So just in case i put all needed info here.
Object mapper configuration:

private final objectMapper =                 
                new ObjectMapper()
                        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                        .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)
                        .setSerializationInclusion(JsonInclude.Include.NON_NULL)
                        .enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.registerModule(javaTimeModule);

Full enum:

public enum ShippingMethods {
    @JsonProperty("0")
    SHIPPING_METHODS_UNSPECIFIED(0),

    @JsonProperty("10")
    SHIPPING_METHODS_FED_EX_PRIORITY_OVERNIGHT(10),

    @JsonProperty("11")
    SHIPPING_METHODS_FED_EX_STANDARD_OVERNIGHT(11),

    @JsonProperty("12")
    SHIPPING_METHODS_FED_EX_FIRST_OVERNIGHT(12),

    @JsonProperty("13")
    SHIPPING_METHODS_FED_EX_2DAY(13),

    @JsonProperty("14")
    SHIPPING_METHODS_FED_EX_EXPRESS_SAVER(14),

    @JsonProperty("15")
    SHIPPING_METHODS_FED_EX_GROUND(15),

    @JsonProperty("16")
    SHIPPING_METHODS_FED_EX_HOME_DELIVERY(16),

    @JsonProperty("17")
    SHIPPING_METHODS_FED_EX_1DAY_FREIGHT(17),

    @JsonProperty("18")
    SHIPPING_METHODS_FED_EX_2DAY_FREIGHT(18),

    @JsonProperty("19")
    SHIPPING_METHODS_FED_EX_3DAY_FREIGHT(19),

    @JsonProperty("20")
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_PRIORITY(20),

    @JsonProperty("21")
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_ECONOMY(21),

    @JsonProperty("22")
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_FIRST(22),

    @JsonProperty("23")
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_PRIORITY_FREIGHT(23),

    @JsonProperty("24")
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_ECONOMY_FREIGHT(24),

    @JsonProperty("25")
    SHIPPING_METHODS_FED_EX_EUROPE_FIRST_INTERNATIONAL_PRIORITY(25),

    @JsonProperty("26")
    SHIPPING_METHODS_FED_EX_SMART_POST(26),

    @JsonProperty("27")
    SHIPPING_METHODS_FED_EX_2DAY_AM(27),

    @JsonProperty("28")
    SHIPPING_METHODS_FED_EX_FIRST_FREIGHT(28),

    @JsonProperty("29")
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_GROUND(29),

    @JsonProperty("30")
    SHIPPING_METHODS_FED_EX_FREIGHT_ECONOMY(30),

    @JsonProperty("31")
    SHIPPING_METHODS_FED_EX_FREIGHT_PRIORITY(31),

    @JsonProperty("35")
    SHIPPING_METHODS_UPS_FIRST_CLASS(35),

    @JsonProperty("36")
    SHIPPING_METHODS_UPS_PRIORITY_MAIL(36),

    @JsonProperty("37")
    SHIPPING_METHODS_UPS_EXPEDITED_MAIL_INNOVATIONS(37),

    @JsonProperty("38")
    SHIPPING_METHODS_UPS_PRIORITY_MAIL_INNOVATIONS(38),

    @JsonProperty("39")
    SHIPPING_METHODS_UPS_ECONOMY_MAIL_INNOVATIONS(39),

    @JsonProperty("40")
    SHIPPING_METHODS_UPS_NEXT_DAY_AIR(40),

    @JsonProperty("41")
    SHIPPING_METHODS_UPS_EXPRESS(41),

    @JsonProperty("42")
    SHIPPING_METHODS_UPS_2ND_DAY_AIR(42),

    @JsonProperty("43")
    SHIPPING_METHODS_UPS_GROUND(43),

    @JsonProperty("44")
    SHIPPING_METHODS_UPS_WORLDWIDE_EXPRESS(44),

    @JsonProperty("45")
    SHIPPING_METHODS_UPS_WORLDWIDE_EXPEDITED(45),

    @JsonProperty("46")
    SHIPPING_METHODS_UPS_EXPEDITED(46),

    @JsonProperty("47")
    SHIPPING_METHODS_UPS_STANDARD(47),

    @JsonProperty("48")
    SHIPPING_METHODS_UPS_3DAY_SELECT(48),

    @JsonProperty("49")
    SHIPPING_METHODS_UPS_NEXT_DAY_AIR_SAVER(49),

    @JsonProperty("50")
    SHIPPING_METHODS_UPS_SAVER(50),

    @JsonProperty("51")
    SHIPPING_METHODS_UPS_NEXT_DAY_AIR_EARLY_AM(51),

    @JsonProperty("52")
    SHIPPING_METHODS_UPS_EXPRESS_EARLY_AM(52),

    @JsonProperty("53")
    SHIPPING_METHODS_UPS_WORLDWIDE_EXPRESS_PLUS(53),

    @JsonProperty("54")
    SHIPPING_METHODS_UPS_EXPRESS_PLUS(54),

    @JsonProperty("55")
    SHIPPING_METHODS_UPS_2ND_DAY_AIR_AM(55),

    @JsonProperty("56")
    SHIPPING_METHODS_UPS_TODAY_STANDARD(56),

    @JsonProperty("57")
    SHIPPING_METHODS_UPS_TODAY_COURIER(57),

    @JsonProperty("58")
    SHIPPING_METHODS_UPS_TODAY_INTER_CITY(58),

    @JsonProperty("59")
    SHIPPING_METHODS_TODAY_EXPRESS(59),

    @JsonProperty("60")
    SHIPPING_METHODS_TODAY_EXPRESS_SAVER(60),

    @JsonProperty("61")
    SHIPPING_METHODS_UPS_WORLDWIDE_EXPRESS_FREIGHT(61),

    @JsonProperty("62")
    SHIPPING_METHODS_UPS_SURE_POST_LESS_THAN_1LB(62),

    @JsonProperty("63")
    SHIPPING_METHODS_UPS_SURE_POST_1LB_OR_GREATER(63),

    @JsonProperty("64")
    SHIPPING_METHODS_UPS_SURE_POST_BPM(64),

    @JsonProperty("65")
    SHIPPING_METHODS_UPS_SURE_POST_MEDIA(65),

    @JsonProperty("70")
    SHIPPING_METHODS_USPS_EXPRESS(70),

    @JsonProperty("71")
    SHIPPING_METHODS_USPS_FIRST_CLASS(71),

    @JsonProperty("72")
    SHIPPING_METHODS_USPS_PRIORITY(72),

    @JsonProperty("73")
    SHIPPING_METHODS_USPS_PARCEL_POST(73),

    @JsonProperty("75")
    SHIPPING_METHODS_USPS_MEDIA(75),

    @JsonProperty("76")
    SHIPPING_METHODS_USPS_LIBRARY(76),

    @JsonProperty("77")
    SHIPPING_METHODS_USPS_ONLINE(77),

    @JsonProperty("78")
    SHIPPING_METHODS_USPS_GLOBAL_EXPRESS(78),

    @JsonProperty("79")
    SHIPPING_METHODS_USPS_PARCEL_SELECT(79),

    @JsonProperty("80")
    SHIPPING_METHODS_USPS_CRITICAL_MAIL(80),

    @JsonProperty("81")
    SHIPPING_METHODS_USPS_STANDARD_MAIL(81),

    @JsonProperty("82")
    SHIPPING_METHODS_USPS_EXPRESS_MAIL_INTERNATIONAL(82),

    @JsonProperty("83")
    SHIPPING_METHODS_USPS_FIRST_CLASS_MAIL_INTERNATIONAL(83),

    @JsonProperty("84")
    SHIPPING_METHODS_USPS_PRIORITY_MAIL_INTERNATIONAL(84);

    private final int shippingMethodId;

    ShippingMethods(final int shippingMethodId) {
        this.shippingMethodId = shippingMethodId;
    }

    public int getShippingMethodId() {
        return shippingMethodId;
    }
}

Object that uses this enum (i think we can safely replace ShippingProviders and ShippingCoverage with int values):

public class ShippingMethodInfo {
    @JsonProperty("typeId")
    private ShippingProviders typeId;

    @JsonProperty("value")
    private ShippingMethods value;

    @JsonProperty("coverage")
    private ShippingCoverage coverage;

    @JsonProperty("label")
    private String label;

    public ShippingProviders getTypeId() {
        return typeId;
    }

    public void setTypeId(ShippingProviders typeId) {
        this.typeId = typeId;
    }

    public ShippingMethods getValue() {
        return value;
    }

    public void setValue(ShippingMethods value) {
        this.value = value;
    }

    public ShippingCoverage getCoverage() {
        return coverage;
    }

    public void setCoverage(ShippingCoverage coverage) {
        this.coverage = coverage;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }
}

Example respose:

{
    "d": [
        {
            "typeId": 0,
            "value": 17,
            "coverage": 1,
            "label": "FedEx 1 Day Freight®"
        },
        {
            "typeId": 0,
            "value": 27,
            "coverage": 1,
            "label": "FedEx 2 Day AM®"
        }
     ]
}

@YuriIvanov
Copy link

YuriIvanov commented May 17, 2017

I also wrote a test for you and it fails.

    public void testSparseNumericEnum()
            throws IOException {
        final ObjectMapper objectMapper =
                new ObjectMapper()
                        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                        .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)
                        .setSerializationInclusion(JsonInclude.Include.NON_NULL)
                        .enable(SerializationFeature.INDENT_OUTPUT);

        String jsonResponse =
                "{\n" +
                        "    \"d\": [\n" +
                        "        {\n" +
                        "            \"typeId\": 0,\n" +
                        "            \"value\": 17,\n" +
                        "            \"coverage\": 1,\n" +
                        "            \"label\": \"FedEx 1 Day Freight®\"\n" +
                        "        }\n" +
                        "     ]\n" +
                        "}";

        JsonResponseEnvelope<List<ShippingMethodInfo>> mappedResponse =
                objectMapper.readValue(
                        jsonResponse,
                        new TypeReference<JsonResponseEnvelope<List<ShippingMethodInfo>>>() {
                        });
        List<ShippingMethodInfo> shippingMethods = mappedResponse.getData();

        assertEquals(
                ShippingMethods.SHIPPING_METHODS_FED_EX_1DAY_FREIGHT,                
                shippingMethods.get(0).getValue());
    }
java.lang.AssertionError: expected [SHIPPING_METHODS_FED_EX_1DAY_FREIGHT] but found [SHIPPING_METHODS_FED_EX_SMART_POST]
Expected :SHIPPING_METHODS_FED_EX_1DAY_FREIGHT
Actual   :SHIPPING_METHODS_FED_EX_SMART_POST

cowtowncoder added a commit that referenced this issue May 18, 2017
@cowtowncoder
Copy link
Member Author

@YuriIvanov Ohhh.... Actually, I did not look carefully at your input. The problem here is actually quite simple, from implementation perspective: values come as numbers, so they are expected to be indexes. If value is String, things work as expected.

This is not something that would be easy to change as there isn't anything to reliably distinguish between the options (that is: when a number is seen to prevent use as index, look for explicit name).
And even use of explicit renaming isn't necessarily an indication at this point.

I think you have 2 main choices here:

  1. Try to ensure that enum values are always serialized as Strings
  2. Write custom Enum deserializer

Doing (2) should be relatively simple, even while still supporting use of @JsonProperty, as AnnotationIntrospector has method "findEnumValues()" which you could use to find full enum name / value mapping.

@YuriIvanov
Copy link

Thanks for help.
First option is not for me. I can't affect response'e enum values format because it is agreement.

I have implemented this workaround (boilerplate but understandable and working):

public enum ShippingMethods {
    SHIPPING_METHODS_UNSPECIFIED,
    SHIPPING_METHODS_FED_EX_PRIORITY_OVERNIGHT,
    SHIPPING_METHODS_FED_EX_STANDARD_OVERNIGHT,
    SHIPPING_METHODS_FED_EX_FIRST_OVERNIGHT,
    SHIPPING_METHODS_FED_EX_2DAY,
    SHIPPING_METHODS_FED_EX_EXPRESS_SAVER,
    SHIPPING_METHODS_FED_EX_GROUND,
    SHIPPING_METHODS_FED_EX_HOME_DELIVERY,
    SHIPPING_METHODS_FED_EX_1DAY_FREIGHT,
    SHIPPING_METHODS_FED_EX_2DAY_FREIGHT,
    SHIPPING_METHODS_FED_EX_3DAY_FREIGHT,
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_PRIORITY,
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_ECONOMY,
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_FIRST,
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_PRIORITY_FREIGHT,
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_ECONOMY_FREIGHT,
    SHIPPING_METHODS_FED_EX_EUROPE_FIRST_INTERNATIONAL_PRIORITY,
    SHIPPING_METHODS_FED_EX_SMART_POST,
    SHIPPING_METHODS_FED_EX_2DAY_AM,
    SHIPPING_METHODS_FED_EX_FIRST_FREIGHT,
    SHIPPING_METHODS_FED_EX_INTERNATIONAL_GROUND,
    SHIPPING_METHODS_FED_EX_FREIGHT_ECONOMY,
    SHIPPING_METHODS_FED_EX_FREIGHT_PRIORITY,
    SHIPPING_METHODS_UPS_FIRST_CLASS,
    SHIPPING_METHODS_UPS_PRIORITY_MAIL,
    SHIPPING_METHODS_UPS_EXPEDITED_MAIL_INNOVATIONS,
    SHIPPING_METHODS_UPS_PRIORITY_MAIL_INNOVATIONS,
    SHIPPING_METHODS_UPS_ECONOMY_MAIL_INNOVATIONS,
    SHIPPING_METHODS_UPS_NEXT_DAY_AIR,
    SHIPPING_METHODS_UPS_EXPRESS,
    SHIPPING_METHODS_UPS_2ND_DAY_AIR,
    SHIPPING_METHODS_UPS_GROUND,
    SHIPPING_METHODS_UPS_WORLDWIDE_EXPRESS,
    SHIPPING_METHODS_UPS_WORLDWIDE_EXPEDITED,
    SHIPPING_METHODS_UPS_EXPEDITED,
    SHIPPING_METHODS_UPS_STANDARD,
    SHIPPING_METHODS_UPS_3DAY_SELECT,
    SHIPPING_METHODS_UPS_NEXT_DAY_AIR_SAVER,
    SHIPPING_METHODS_UPS_SAVER,
    SHIPPING_METHODS_UPS_NEXT_DAY_AIR_EARLY_AM,
    SHIPPING_METHODS_UPS_EXPRESS_EARLY_AM,
    SHIPPING_METHODS_UPS_WORLDWIDE_EXPRESS_PLUS,
    SHIPPING_METHODS_UPS_EXPRESS_PLUS,
    SHIPPING_METHODS_UPS_2ND_DAY_AIR_AM,
    SHIPPING_METHODS_UPS_TODAY_STANDARD,
    SHIPPING_METHODS_UPS_TODAY_COURIER,
    SHIPPING_METHODS_UPS_TODAY_INTER_CITY,
    SHIPPING_METHODS_TODAY_EXPRESS,
    SHIPPING_METHODS_TODAY_EXPRESS_SAVER,
    SHIPPING_METHODS_UPS_WORLDWIDE_EXPRESS_FREIGHT,
    SHIPPING_METHODS_UPS_SURE_POST_LESS_THAN_1LB,
    SHIPPING_METHODS_UPS_SURE_POST_1LB_OR_GREATER,
    SHIPPING_METHODS_UPS_SURE_POST_BPM,
    SHIPPING_METHODS_UPS_SURE_POST_MEDIA,
    SHIPPING_METHODS_USPS_EXPRESS,
    SHIPPING_METHODS_USPS_FIRST_CLASS,
    SHIPPING_METHODS_USPS_PRIORITY,
    SHIPPING_METHODS_USPS_PARCEL_POST,
    SHIPPING_METHODS_USPS_MEDIA,
    SHIPPING_METHODS_USPS_LIBRARY,
    SHIPPING_METHODS_USPS_ONLINE,
    SHIPPING_METHODS_USPS_GLOBAL_EXPRESS,
    SHIPPING_METHODS_USPS_PARCEL_SELECT,
    SHIPPING_METHODS_USPS_CRITICAL_MAIL,
    SHIPPING_METHODS_USPS_STANDARD_MAIL,
    SHIPPING_METHODS_USPS_EXPRESS_MAIL_INTERNATIONAL,
    SHIPPING_METHODS_USPS_FIRST_CLASS_MAIL_INTERNATIONAL,
    SHIPPING_METHODS_USPS_PRIORITY_MAIL_INTERNATIONAL;

    private static final Map<Integer, ShippingMethods> enumMap = new HashMap<>();
    static {
        enumMap.put(0, SHIPPING_METHODS_UNSPECIFIED);
        enumMap.put(10, SHIPPING_METHODS_FED_EX_PRIORITY_OVERNIGHT);
        enumMap.put(11, SHIPPING_METHODS_FED_EX_STANDARD_OVERNIGHT);
        enumMap.put(12, SHIPPING_METHODS_FED_EX_FIRST_OVERNIGHT);
        enumMap.put(13, SHIPPING_METHODS_FED_EX_2DAY);
        enumMap.put(14, SHIPPING_METHODS_FED_EX_EXPRESS_SAVER);
        enumMap.put(15, SHIPPING_METHODS_FED_EX_GROUND);
        enumMap.put(16, SHIPPING_METHODS_FED_EX_HOME_DELIVERY);
        enumMap.put(17, SHIPPING_METHODS_FED_EX_1DAY_FREIGHT);
        enumMap.put(18, SHIPPING_METHODS_FED_EX_2DAY_FREIGHT);
        enumMap.put(19, SHIPPING_METHODS_FED_EX_3DAY_FREIGHT);
        enumMap.put(20, SHIPPING_METHODS_FED_EX_INTERNATIONAL_PRIORITY);
        enumMap.put(21, SHIPPING_METHODS_FED_EX_INTERNATIONAL_ECONOMY);
        enumMap.put(22, SHIPPING_METHODS_FED_EX_INTERNATIONAL_FIRST);
        enumMap.put(23, SHIPPING_METHODS_FED_EX_INTERNATIONAL_PRIORITY_FREIGHT);
        enumMap.put(24, SHIPPING_METHODS_FED_EX_INTERNATIONAL_ECONOMY_FREIGHT);
        enumMap.put(25, SHIPPING_METHODS_FED_EX_EUROPE_FIRST_INTERNATIONAL_PRIORITY);
        enumMap.put(26, SHIPPING_METHODS_FED_EX_SMART_POST);
        enumMap.put(27, SHIPPING_METHODS_FED_EX_2DAY_AM);
        enumMap.put(28, SHIPPING_METHODS_FED_EX_FIRST_FREIGHT);
        enumMap.put(29, SHIPPING_METHODS_FED_EX_INTERNATIONAL_GROUND);
        enumMap.put(30, SHIPPING_METHODS_FED_EX_FREIGHT_ECONOMY);
        enumMap.put(31, SHIPPING_METHODS_FED_EX_FREIGHT_PRIORITY);
        enumMap.put(35, SHIPPING_METHODS_UPS_FIRST_CLASS);
        enumMap.put(36, SHIPPING_METHODS_UPS_PRIORITY_MAIL);
        enumMap.put(37, SHIPPING_METHODS_UPS_EXPEDITED_MAIL_INNOVATIONS);
        enumMap.put(38, SHIPPING_METHODS_UPS_PRIORITY_MAIL_INNOVATIONS);
        enumMap.put(39, SHIPPING_METHODS_UPS_ECONOMY_MAIL_INNOVATIONS);
        enumMap.put(40, SHIPPING_METHODS_UPS_NEXT_DAY_AIR);
        enumMap.put(41, SHIPPING_METHODS_UPS_EXPRESS);
        enumMap.put(42, SHIPPING_METHODS_UPS_2ND_DAY_AIR);
        enumMap.put(43, SHIPPING_METHODS_UPS_GROUND);
        enumMap.put(44, SHIPPING_METHODS_UPS_WORLDWIDE_EXPRESS);
        enumMap.put(45, SHIPPING_METHODS_UPS_WORLDWIDE_EXPEDITED);
        enumMap.put(46, SHIPPING_METHODS_UPS_EXPEDITED);
        enumMap.put(47, SHIPPING_METHODS_UPS_STANDARD);
        enumMap.put(48, SHIPPING_METHODS_UPS_3DAY_SELECT);
        enumMap.put(49, SHIPPING_METHODS_UPS_NEXT_DAY_AIR_SAVER);
        enumMap.put(50, SHIPPING_METHODS_UPS_SAVER);
        enumMap.put(51, SHIPPING_METHODS_UPS_NEXT_DAY_AIR_EARLY_AM);
        enumMap.put(52, SHIPPING_METHODS_UPS_EXPRESS_EARLY_AM);
        enumMap.put(53, SHIPPING_METHODS_UPS_WORLDWIDE_EXPRESS_PLUS);
        enumMap.put(54, SHIPPING_METHODS_UPS_EXPRESS_PLUS);
        enumMap.put(55, SHIPPING_METHODS_UPS_2ND_DAY_AIR_AM);
        enumMap.put(56, SHIPPING_METHODS_UPS_TODAY_STANDARD);
        enumMap.put(57, SHIPPING_METHODS_UPS_TODAY_COURIER);
        enumMap.put(58, SHIPPING_METHODS_UPS_TODAY_INTER_CITY);
        enumMap.put(59, SHIPPING_METHODS_TODAY_EXPRESS);
        enumMap.put(60, SHIPPING_METHODS_TODAY_EXPRESS_SAVER);
        enumMap.put(61, SHIPPING_METHODS_UPS_WORLDWIDE_EXPRESS_FREIGHT);
        enumMap.put(62, SHIPPING_METHODS_UPS_SURE_POST_LESS_THAN_1LB);
        enumMap.put(63, SHIPPING_METHODS_UPS_SURE_POST_1LB_OR_GREATER);
        enumMap.put(64, SHIPPING_METHODS_UPS_SURE_POST_BPM);
        enumMap.put(65, SHIPPING_METHODS_UPS_SURE_POST_MEDIA);
        enumMap.put(70, SHIPPING_METHODS_USPS_EXPRESS);
        enumMap.put(71, SHIPPING_METHODS_USPS_FIRST_CLASS);
        enumMap.put(72, SHIPPING_METHODS_USPS_PRIORITY);
        enumMap.put(73, SHIPPING_METHODS_USPS_PARCEL_POST);
        enumMap.put(75, SHIPPING_METHODS_USPS_MEDIA);
        enumMap.put(76, SHIPPING_METHODS_USPS_LIBRARY);
        enumMap.put(77, SHIPPING_METHODS_USPS_ONLINE);
        enumMap.put(78, SHIPPING_METHODS_USPS_GLOBAL_EXPRESS);
        enumMap.put(79, SHIPPING_METHODS_USPS_PARCEL_SELECT);
        enumMap.put(80, SHIPPING_METHODS_USPS_CRITICAL_MAIL);
        enumMap.put(81, SHIPPING_METHODS_USPS_STANDARD_MAIL);
        enumMap.put(82, SHIPPING_METHODS_USPS_EXPRESS_MAIL_INTERNATIONAL);
        enumMap.put(83, SHIPPING_METHODS_USPS_FIRST_CLASS_MAIL_INTERNATIONAL);
        enumMap.put(84, SHIPPING_METHODS_USPS_PRIORITY_MAIL_INTERNATIONAL);
    }

    @JsonCreator
    public static ShippingMethods forValue(Integer value) {
        return enumMap.get(value);
    }

    @JsonValue
    public Integer toValue() {
        for (Map.Entry<Integer, ShippingMethods> entry : enumMap.entrySet()) {
            if (entry.getValue() == this)
                return entry.getKey();
        }
        return null; // or fail
    }

When I will have more time i'll investigate second option with introspection.

@cowtowncoder
Copy link
Member Author

@YuriIvanov Yes I believe this is the way to do it at this point. You should be able to simplify the code, however, by iterating over ShippingMethods.values(), and creating the map dynamically, which can help a bit.

@cowtowncoder
Copy link
Member Author

Not 100% sure what could be done here; will close, may be re-filed with specific feature request, improvement idea.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants