이번에 스타앱을 리뉴얼하면서 기존에 안드로이드 내장 api로 쓰고 있던
json관련 라이브러리 대신, oop에 맞는 gson으로 사용하기로 결정하고
사용하던 중, @Expose 어노테이션을 우연찮게 발견했다.
이 놈은 JPA에서 쓰는 놈인가…(사내에서 JPA를 Persistence Layer
에서 쓰고 있음) 들여다봤더니 gson에서 쓰는 놈이길래 테스트코드를
간단히 만들어보았다.
-Temp.java- public class Temp { @Column(primaryKey=true, autoIncrement=true) private Integer id; @Column(name="name") private String name; }
아래는 위의 도메인클래스로 json을 만드는 junit 테스트코드이다.
package com.glider.test.etc; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; import com.glider.wiki.domain.Temp; import com.google.gson.Gson; import com.google.gson.GsonBuilder; /** * @author bluepoet * */ public class GsonTest { Logger logger = Logger.getLogger(this.getClass()); private Gson gson; @Before public void setup() { gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); } @Test public void gsonExcludedField() { Temp temp = new Temp(); temp.setId(1); temp.setName("bluepoet"); String resultJson = gson.toJson(temp); logger.debug("## 결과 json String : " + resultJson); } }
결과는 “json String : “, 아무것도 나오지 않는다 ㅡㅡ;
일단, 제외하고자 필드전략을 쓸때는 json 객체를 만들 때,
GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()로 생성한 후에
object class의 필드에 @Expose 어노테이션을 추가하면 해당 필드만 json으로 만들어준다
위의 Temp.java를 아래와 같이 바꿔보면,
-Temp.java- import com.google.gson.annotations.Expose; public class Temp { @Column(primaryKey=true, autoIncrement=true) @Expose private Integer id; @Column(name="name") private String name; }
저렇게 하면 결과는, “json String : {“id”:1}”로 나온다.
참고로, 사용자정의 Exclusion 전략을 만들어 사용할수도 있다.
아래 url을 참고하면 된다.