복붙노트

[SPRING] 탈 직렬화 중에 빈 객체를 무시하도록 Jackson에게 알려주는 방법?

SPRING

탈 직렬화 중에 빈 객체를 무시하도록 Jackson에게 알려주는 방법?

deserialization 프로세스 (JSON 데이터를 Java Object로 변환하는 과정을 이해함)에서 Jackson이 데이터가없는 객체를 읽을 때이를 무시해야한다고 어떻게 말할 수 있습니까?

Jackson 2.6.6 및 Spring 4.2.6을 사용하고 있습니다.

내 컨트롤러에서받은 JSON 데이터는 다음과 같습니다.

{
    "id": 2,
    "description": "A description",
    "containedObject": {}
}

문제는 객체 "containedObject"가있는 것으로 해석되고 인스턴스화된다는 것입니다. 따라서 내 컨트롤러가이 JSON 데이터를 읽는 즉시 ContainedObject 객체 유형의 인스턴스를 생성하지만 대신 null이되어야합니다.

가장 쉽고 빠른 솔루션은 JSON 데이터를받은 경우이 값이 다음과 같이 null이 될 수 있습니다.

 {
        "id": 2,
        "description": "A description",
        "containedObject": null
    }

하지만 나에게 전송 된 JSON 데이터를 제어 할 수 없기 때문에 이는 불가능합니다.

deserialization 프로세스에서 작동하고 내 상황에서 도움이 될 수있는 주석 (여기에 설명 된 것과 같은)이 있습니까?

나는 더 많은 정보를 얻기 위해 수업을 대표한다.

내 엔티티 클래스는 다음과 같습니다.

public class Entity {
    private long id;
    private String description;
    private ContainedObject containedObject;

//Contructor, getters and setters omitted

}

그리고 내 포함 된 개체 클래스는 다음과 같습니다 :

public class ContainedObject {
    private long contObjId;
    private String aString;

//Contructor, getters and setters omitted

}

해결법

  1. ==============================

    1.나는 JsonDeserializer를 사용할 것이다. 문제의 필드를 조사해, 하늘인지 null인지를 판정합니다. 그 때문에, 포함 된 오브젝트는 null가됩니다.

    나는 JsonDeserializer를 사용할 것이다. 문제의 필드를 조사해, 하늘인지 null인지를 판정합니다. 그 때문에, 포함 된 오브젝트는 null가됩니다.

    이 같은 것 (준 의사) :

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

    귀하의 모델에서 :

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

    희망이 도움이!

  2. ==============================

    2.다음과 같이 사용자 정의 디시리얼라이저를 구현할 수 있습니다.

    다음과 같이 사용자 정의 디시리얼라이저를 구현할 수 있습니다.

    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);
        }
    
      }
    }
    
  3. ==============================

    3.접근법 1 : 이것은 주로 사용됩니다. @JsonInclude는 빈 / null / default values.Use @ JsonInclude (JsonInclude.Include.NON_NULL) 또는 @JsonInclude (JsonInclude.Include.NON_EMPTY) 귀하의 요구 사항에 따라 속성을 제외하는 데 사용됩니다.

    접근법 1 : 이것은 주로 사용됩니다. @JsonInclude는 빈 / null / default values.Use @ JsonInclude (JsonInclude.Include.NON_NULL) 또는 @JsonInclude (JsonInclude.Include.NON_EMPTY) 귀하의 요구 사항에 따라 속성을 제외하는 데 사용됩니다.

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

    jackson 주석에 대한 추가 정보 : https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations

    접근법 2 : GSON

    GSON (https://code.google.com/p/google-gson/)을 사용하십시오.

  4. from https://stackoverflow.com/questions/40366524/how-to-tell-jackson-to-ignore-empty-object-during-deserialization by cc-by-sa and MIT license