| 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); |
| } |
| } |