package com.fasterxml.jackson.failing; import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; /** * NOTE: not assumed to be actual bug -- real numbers are not coerced into * Strings, and are instead assumed to always mean index numbers. * But test retained in case there might be ways to improve support * here: as is, one MUST use Creator method to resolve from number to * enum. */ public class EnumDeserialization1626Test extends BaseMapTest { static class JsonResponseEnvelope<T> { @JsonProperty("d") public T data; } static class ShippingMethodInfo { @JsonProperty("typeId") public int typeId; @JsonProperty("value") private ShippingMethods value; @JsonProperty("coverage") public int coverage; } enum ShippingMethods { @JsonProperty("0") SHIPPING_METHODS_UNSPECIFIED(0), @JsonProperty("10") SHIPPING_METHODS_FED_EX_PRIORITY_OVERNIGHT(10), @JsonProperty("17") SHIPPING_METHODS_FED_EX_1DAY_FREIGHT(17), ; private final int shippingMethodId; ShippingMethods(final int shippingMethodId) { this.shippingMethodId = shippingMethodId; } public int getShippingMethodId() { return shippingMethodId; } } /* /********************************************************** /* Test methods /********************************************************** */ protected final ObjectMapper MAPPER = new ObjectMapper(); // [databind#1626] public void testSparseNumericEnum626() throws Exception { String jsonResponse = "{\n" + " \"d\": [\n" + " {\n" + " \"typeId\": 0,\n" + // NOTE! Only real number fails; quoted-as-String is bound as expected " \"value\": 17,\n" + " \"coverage\": 1"+ " }\n" + " ]\n" + "}"; JsonResponseEnvelope<List<ShippingMethodInfo>> mappedResponse = MAPPER.readValue(jsonResponse, new TypeReference<JsonResponseEnvelope<List<ShippingMethodInfo>>>() { }); List<ShippingMethodInfo> shippingMethods = mappedResponse.data; assertEquals(ShippingMethods.SHIPPING_METHODS_FED_EX_1DAY_FREIGHT, shippingMethods.get(0).value); } }