Thanks much! I would post this as an issue.
Regards, Remya On Tuesday, 12 December 2017 17:03:47 UTC-6, Tatu Saloranta wrote: > > On Tue, Dec 12, 2017 at 8:11 AM, Remya <[email protected] <javascript:>> > wrote: > > Hi, > > > > As I mentioned in one of my earlier responses, had also tried adding > this > > configuration - > > > objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, > > > > true); > > > > This resulted in the Unknown attribute KEY to be deserialized as "null". > > (i.e., instead of Test=No, it gets deserialized as null=No) > > > > My intention is to ignore this attribute completely during > deserialization. > > Please let me know if that would be possible by any means. > > > > Meanwhile, would try READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE > > Ah. The challenge here is that it is not an Enum-valued property, but > EnumMap (or, equivalently, EnumSet) valued > property, meaning that deserializer for the Map would need to be aware > of the special handling. > And for general Maps there just isn't any way to declare that there > are invalid entries that are to be ignored -- > invalid entries are typicallt hard failures. > > However, it seems like a reasonable improvement idea to allow > specialized handling, since I think there is > a dedicated serializer (due to special requirements for constructing > EnumMap). > > Could you file am issue for `jackson-databind` for requesting handling > of unknown/unmapped Enum keys, > wrt `DeserializationFeature`s discussed here? > To me it seems reasonable that "as null" would result in "ignore" > (many Map types do not allow `null` keys, > specifically EnumMap doesn't). This could even be implemented in a > patch for 2.9 (if I have time) since it > does not require API changes. > > -+ Tatu +- > > > > > > Thanks! > > > > On Monday, 11 December 2017 23:35:52 UTC-6, Tatu Saloranta wrote: > >> > >> On Mon, Dec 11, 2017 at 8:37 PM, Remya <[email protected]> wrote: > >> > > >> > Thanks for the response. > >> > > >> > That was just a sample that I posted. The cases do match and yes, my > >> > requirement is when a new attribute - say, 'Test' comes in the Json, > I > >> > want > >> > the mapper to ignore that field and proceed with de-serializing the > >> > remaining fields that has a match in the Enum, rather than throwing > the > >> > exception. > >> > > >> > What should I do, so that it ignores the attributes which does not > have > >> > an > >> > entry in the Enum? > >> > >> You probably want to enable one of following `DeserializationFeature`s: > >> > >> * `READ_UNKNOWN_ENUM_VALUES_AS_NULL` > >> * `READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE` (uses Enum value > >> annotated with `com.fasterxml.jackson.annotation.JsonEnumDefaultValue`) > >> > >> -+ Tatu +- > >> > >> > > >> > Regards, > >> > Remya > >> > > >> > On Monday, 11 December 2017 22:21:32 UTC-6, Tatu Saloranta wrote: > >> >> > >> >> In this case enum names do not match wrt casing? ("count" key, but > enum > >> >> `Count`; nor is there enum `Test` defined) > >> >> So it seems to me exception is due to simple mismatch between keys > >> >> used, > >> >> names of Enums. > >> >> > >> >> -+ Tatu +- > >> >> > >> >> > >> >> On Mon, Dec 11, 2017 at 7:03 PM, Remya <[email protected]> wrote: > >> >>> > >> >>> > >> >>> Sample of JSON String would look like this. > >> >>> > >> >>> String > >> >>> > >> >>> > jsonText="{\"cartId\":\"31028\",\"userId\":\"106784\",\"attributes\":{\"count\":\"1\",\"amount\":\"10\",\"email\":\"N\",\"Test\":\"No\",\"phone\":\"N\"}}"; > > > >> >>> > >> >>> The JSON maps to a Cart class, which holds these attributes as a > Map. > >> >>> > >> >>> public class Cart { > >> >>> > >> >>> private String cartId; > >> >>> private String userId; > >> >>> private Map<Attributes,String> attributes; > >> >>> > >> >>> } > >> >>> > >> >>> Attributes map to the Enum, as given below. > >> >>> > >> >>> public enum Attributes { > >> >>> Count(0), > >> >>> Amount(1), > >> >>> Email(2), > >> >>> Phone(3); > >> >>> > >> >>> private final int value; > >> >>> > >> >>> private Attributes(int value) { > >> >>> this.value = value; > >> >>> } > >> >>> > >> >>> public int getValue() { > >> >>> return value; > >> >>> } > >> >>> > >> >>> public static Attributes findByValue(int value) { > >> >>> switch (value) { > >> >>> case 0: > >> >>> return Count; > >> >>> case 1: > >> >>> return Amount; > >> >>> case 2: > >> >>> return Email; > >> >>> case 3: > >> >>> return Phone; > >> >>> default: > >> >>> return null; > >> >>> } > >> >>> } > >> >>> } > >> >>> > >> >>> Thanks! > >> >>> > >> >>> On Monday, 11 December 2017 17:37:34 UTC-6, Tatu Saloranta wrote: > >> >>>> > >> >>>> Ok, so .... what are classes involved? And input JSON? > >> >>>> > >> >>>> -+ Tatu +- > >> >>>> > >> >>>> On Mon, Dec 11, 2017 at 1:50 PM, Remya <[email protected]> wrote: > >> >>>>> > >> >>>>> I am trying to deserialize a JSON string using jackson-databind > >> >>>>> Objectmapper which has a set of Enum attributes within it. > >> >>>>> > >> >>>>> > >> >>>>> This happens when an unknown attribute, which is not defined in > the > >> >>>>> enum comes in the JSON. Please find below the object mapper > >> >>>>> configuration > >> >>>>> that I am using. > >> >>>>> > >> >>>>> ObjectMapper objectMapper = new ObjectMapper(); > >> >>>>> objectMapper.setVisibility(PropertyAccessor.ALL, > >> >>>>> Visibility.NONE); > >> >>>>> objectMapper.setVisibility(PropertyAccessor.FIELD, > >> >>>>> Visibility.ANY); > >> >>>>> objectMapper.setSerializationInclusion(Include.NON_NULL); > >> >>>>> > >> >>>>> > >> >>>>> > objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, > >> >>>>> false); > >> >>>>> > >> >>>>> But, deserialization (objectMapper.readValue(jsonText, .class);) > >> >>>>> throws > >> >>>>> this error. "Test" is the unknown attribute that comes in the > JSON > >> >>>>> String to > >> >>>>> be deserialized. > >> >>>>> > >> >>>>> com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot > >> >>>>> deserialize Map key of type com..* from String "Test": not a > valid > >> >>>>> representation, problem: > >> >>>>> (com.fasterxml.jackson.databind.exc.InvalidFormatException) > Cannot > >> >>>>> deserialize Map key of type com.... from String "Test": not one > of > >> >>>>> values > >> >>>>> excepted for Enum class: [ ] > >> >>>>> > >> >>>>> > >> >>>>> Could someone please help me out with this issue? > >> >>>>> > >> >>>>> > >> >>>>> Thanks! > >> >>>>> > >> >>>>> -- > >> >>>>> You received this message because you are subscribed to the > Google > >> >>>>> Groups "jackson-user" group. > >> >>>>> To unsubscribe from this group and stop receiving emails from it, > >> >>>>> send > >> >>>>> an email to [email protected]. > >> >>>>> To post to this group, send email to [email protected]. > >> >>>>> For more options, visit https://groups.google.com/d/optout. > >> >>>> > >> >>>> > >> >>> -- > >> >>> You received this message because you are subscribed to the Google > >> >>> Groups > >> >>> "jackson-user" group. > >> >>> To unsubscribe from this group and stop receiving emails from it, > send > >> >>> an > >> >>> email to [email protected]. > >> >>> To post to this group, send email to [email protected]. > >> >>> For more options, visit https://groups.google.com/d/optout. > >> >> > >> >> > >> > -- > >> > You received this message because you are subscribed to the Google > >> > Groups > >> > "jackson-user" group. > >> > To unsubscribe from this group and stop receiving emails from it, > send > >> > an > >> > email to [email protected]. > >> > To post to this group, send email to [email protected]. > >> > For more options, visit https://groups.google.com/d/optout. > > > > -- > > You received this message because you are subscribed to the Google > Groups > > "jackson-user" group. > > To unsubscribe from this group and stop receiving emails from it, send > an > > email to [email protected] <javascript:>. > > To post to this group, send email to [email protected] > <javascript:>. > > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "jackson-user" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. For more options, visit https://groups.google.com/d/optout.
