How to tell Jackson to ignore empty object during deserialization?

后端 未结 3 1979
遥遥无期
遥遥无期 2020-12-06 06:40

At the deserialization process (which as I understand is the process of converting JSON data into a Java Object), how can I tell Jackson that when it reads a object that con

相关标签:
3条回答
  • 2020-12-06 07:04

    I would use a JsonDeserializer. Inspect the field in question, determine, if it is emtpy and return null, so your ContainedObject would be null.

    Something like this (semi-pseudo):

     public class MyDes extends JsonDeserializer<ContainedObject> {
    
            @Override
            public String deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
                //read the JsonNode and determine if it is empty JSON object
                //and if so return null
    
                if (node is empty....) {
                    return null;
                }
                return node;
            }
    
        }
    

    then in your model:

     public class Entity {
        private long id;
        private String description;
    
        @JsonDeserialize(using = MyDes.class)
        private ContainedObject containedObject;
    
       //Contructor, getters and setters omitted
    
     }
    

    Hope this helps!

    0 讨论(0)
  • 2020-12-06 07:17

    You can implement a custom deserializer as follows:

    public class Entity {
        private long id;
        private String description;
        @JsonDeserialize(using = EmptyToNullObject.class)
        private ContainedObject containedObject;
    
    //Contructor, getters and setters omitted
    
    }
    
    
    public class EmptyToNullObject extends JsonDeserializer<ContainedObject> {
    
      public ContainedObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        long contObjId = (Long) ((LongNode) node.get("contObjId")).numberValue();
        String aString = node.get("aString").asText();
        if(aString.equals("") && contObjId == 0L) {
          return null;
        } else {
          return new ContainedObject(contObjId, aString);
        }
    
      }
    }
    
    0 讨论(0)
  • 2020-12-06 07:18

    Approach 1 : This is mostly used. @JsonInclude is used to exclude properties with empty/null/default values.Use @JsonInclude(JsonInclude.Include.NON_NULL) or @JsonInclude(JsonInclude.Include.NON_EMPTY) as per your requirement.

        @JsonInclude(JsonInclude.Include.NON_NULL)
        public class Employee {
    
            private String empId;
            private String firstName;
    
            @JsonInclude(JsonInclude.Include.NON_NULL)
            private String lastName;
            private String address;
            private String emailId;
    
       }
    

    More info about the jackson annotations : https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations

    Approach 2 : GSON

    use GSON (https://code.google.com/p/google-gson/)

    0 讨论(0)
提交回复
热议问题