[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.나는 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.다음과 같이 사용자 정의 디시리얼라이저를 구현할 수 있습니다.
다음과 같이 사용자 정의 디시리얼라이저를 구현할 수 있습니다.
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.접근법 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/)을 사용하십시오.
from https://stackoverflow.com/questions/40366524/how-to-tell-jackson-to-ignore-empty-object-during-deserialization by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Tomcat에 배포하려고 할 때 발생 원인 : java.lang.NoSuchFieldError : NULL (0) | 2019.01.21 |
---|---|
[SPRING] 스프링을 사용하여 동적으로 특성 파일로드 (0) | 2019.01.21 |
[SPRING] DispatcherServlet에 따라 ContextLoaderListener 사용 (0) | 2019.01.21 |
[SPRING] Spring webSecurity.ignoring ()은 사용자 정의 필터를 무시하지 않습니다. (0) | 2019.01.21 |
[SPRING] Spring @ 트랜잭션 방식 - 참여 트랜잭션 (0) | 2019.01.21 |