- 전체
- JAVA 일반
- JAVA 수학
- JAVA 그래픽
- JAVA 자료구조
- JAVA 인공지능
- JAVA 인터넷
- Java Framework
- Java GUI (AWT,SWING,SWT,JFACE)
- SWT and RCP (web RAP/RWT)[eclipse], EMF
JAVA 자료구조 [java, jackson] [jackson] json serialize 만 ignore 하고 싶다면?
2020.11.07 16:11
[java, jackson] [jackson] json serialize 만 ignore 하고 싶다면?
필드에 @JsonIgnore 어노테이션을 사용하여 코딩하다보면 항상 마주하게 되는 문제점이 있다.
바로 deserialize시 데이터 저장이 안된다는 점...
이게 다 '필드'에 @JsonIgnore를 설정하면 getter, setter에 모두 적용되어 발생하는 문제인데..
그럼 왜 필드에 사용하느냐? 아마 대부분 lombok을 사용하니까 그렇게 쓰지 않을까 싶다..
여튼 원론적으로.. 직렬화(getter)/ 역직렬화(setter) 시 원하는 범위에만 @JsonIgnore를 적용하고 싶으면 그 부분에만 사용해주면 된다는 점!
한마디로.. @JsonIgnore/ @JsonProperty를 getter/setter에 사용하거나 @JsonProperty access 범위를 필드에 지정하면 된다.
물론 이런 커스터마이징이 많이 필요하다는 얘기는 설계를 다시 한 번 생각해봐야 한다는 것이겠지만.. 불가피한 경우가 있으므로..ㅎ
이런 경우는 상속말고 합성을 통해 좀 더 직관적인 설계가 가능한 경우가 많다.
여튼 이 글의 주제로 돌아와서.. 백문이 불여일견.
{"visible":"visible","invisible":"invisible"}
final String json = "{\"visible\":\"visible\",\"invisible\":\"invisible\"}";
ResponseSample responseSample = new ObjectMapper().readValue(json, ResponseSample.class);
System.out.println("deserialize : " + responseSample);
System.out.println("serialize : " + new ObjectMapper().writeValueAsString(responseSample));
Case 1. 최초 생성 모델
@Getter
@Setter
@ToString
class ResponseSample implements Serializable {
private static final long serialVersionUID = -1246490797953136249L;
private String visible;
private String invisible;
}
결과
deserialize : ResponseSample(visible=visible, invisible=invisible) serialize : {"visible":"visible","invisible":"invisible"}
Case 2. field @JsonIgnore 적용 모델
@Getter @Setter @ToString class ResponseSample implements Serializable { private static final long serialVersionUID = -1246490797953136249L; private String visible; @JsonIgnore private String invisible; }
결과
deserialize : ResponseSample(visible=visible, invisible=null) serialize : {"visible":"visible"}
Case 3. getter @JsonIgnore 적용 모델
@Getter @Setter @ToString class ResponseSample implements Serializable { private static final long serialVersionUID = -1246490797953136249L; private String visible; private String invisible; @JsonIgnore public String getInvisible() { return invisible; } @JsonProperty public void setInvisible(String invisible) { this.invisible = invisible; } }
결과
deserialize : ResponseSample(visible=visible, invisible=invisible) serialize : {"visible":"visible"}
Case 4. @JsonProperty access 적용 모델
@Getter @Setter @ToString class ResponseSample implements Serializable { private static final long serialVersionUID = -1246490797953136249L; private String visible; @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) private String invisible; }
결과
deserialize : ResponseSample(visible=visible, invisible=invisible) serialize : {"visible":"visible"}
출처: https://androphil.tistory.com/737 [소림사의 홍반장!]
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

