[gson]어노테이션을 사용하여 object중에 json으로 만들 필드 제외하기

이번에 스타앱을 리뉴얼하면서 기존에 안드로이드 내장 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을 참고하면 된다.

User Defined Exclusion Strategies

Advertisements