프로그래밍/Android

gson 소개 및 사용법

freemmer 2016. 8. 3. 11:16

gson 소개 및 사용법

예전에 Native (Android, iOS등)와 WAS 서버간의 통신시 사용하는 포맷은 여러 방식이 있었습니다. 그중에 대표적인 것으로 xml과 json이 있는데요. 요새는 json이 대세인듯 합니다.
gson은 이 json을 편하게 사용할 수 있도록 google에서 만든 json관련 라이브러리 입니다.
json과 java객체 간의 직렬화(Serialization)와 역직렬화(Deserialization)를 쉽게 할 수 있게 도와주기 때문에 json자체의 파싱보다는 업무로직 자체에 집중할 수 있도록 도와줍니다.

1. 설치하기 (Android Studio gradle 설정)

Android Studio build.gradle(app) 설정
dependencies {
compile 'com.google.code.gson:gson:2.2.4'
}
Proguard 설정
-keep class com.google.gson.examples.android.model.** { *; }

2. 성능비교 (JSON.simple vs GSON vs Jackson vs JSONP)

친절하게도 여러 라이브러리의 성능을 비교한 사이트가 있네요.
보시다시피 큰용량의 파일은 Jackson이, 작은 용량의 파일은 gson이 좋은 효율을 보이고 있습니다.
목적,용도에 따라 선택하여 사용하시면 되겠습니다만, 일반적인 app인 경우에는 gson으로 충분할 것 같네요.

2. gson 2.3에서 새로운 기능

What's new in Gson 2.3

In this article we look at the additions in Google Json 2.3. There are three main changes :

gson이 2.3으로 업데이트 되면서 위와 같은 기능이 추가되었다고 합니다. 하지만 저의 경우는 2.3으로 업그레이드를 할 필요성을 느끼진 못했습니다. 무조건 최신 버전으로 교체하시기 보다는 필요에 따라 선택하시는 편이 좋을 것 같습니다.

3. 사용예제

레퍼런스 문서를 모두 읽고 사용하는 것이 가장 좋습니다만 이 글에서는 간단히 사용하는 방법을 다루어보겠습니다.
예제 소스는 TestCase (AndroidTest)로 작성되었습니다.
public class TestCase_GSON_Deserialization extends AndroidTestCase {
private String dummyData =
"{" +
"\"message\":\"Free Music Archive\"," +
"\"title\":\"Albums\"" +
"}";
class Albums {
public String title;
public String message;
}
/**
* (object -> json)
*/
public void testSerializationFromDummyData() {
Albums obj = new Albums();
obj.title = "Albums";
obj.message = "Free Music Archive";
String json = new Gson().toJson(obj);
assertNotNull(json);
assertEquals(json, dummyData);
}
/**
* (json -> object)
*/
public void testDeserializationFromDummyData() {
Albums obj = new Gson().fromJson(dummyData, Albums.class);
assertNotNull(obj);
assertEquals("Albums", obj.title);
assertEquals("Free Music Archive", obj.message);
}
}
gson이 ​​직렬화 하는 실제 코드는 ​String json = new Gson().toJson(obj);
역직렬화 하는 실제 코드는 Albums obj = new Gson().fromJson(dummyData, Albums.class);
로 간단합니다.

여기서 주의할 점은 json의 key 이름이 class의 변수 이름과 동일하다는 점 입니다.
하지만, json의 key이름이 한글이라면 class의 변수 이름을 어떻게 정의해야 할까요?
이러한 경우를 대비해 gson이 @SerializedName 이라는 annotation을 제공합니다. json의 key이름이을 사용하면 위의 Albums 클래스는 다음과 같이 작성할 수 있습니다. (그 외의 annotation의 예제는 다음 사이트에서 보실 수 있습니다)
{
"": "Albums",
"": "Free Music Archive"
}
class Albums {
@SerializedName("")
public String title;
@SerializedName("")
public String message;
}

4. 응용하기

이제 gson의 사용법은 익혔으니 json의 형식에 따라 class의 변수를 어떻게 만들어야 하는지 알아보도록 하겠습니다.
{
"": "Albums"
"": "Free Music Archive",
"": ["Archive 2016", "Archive 2015", "Archive 2014"],
"": {
"": "/Document/Albums/",
"": "20.5G"
},
}
class Albums {
@SerializedName("")
public String title;
@SerializedName("")
public String message;
@SerializedName("")
public ArrayList<String> items = new ArrayList<String>();
@SerializedName("")
public Map<String, String> data = new HashMap<String, String>();
}
json의 배열 형식은 ArraryList<String>으로 받을 수 있습니다.
그리고 ‘정보’의 데이터와 같이 json형식은 Map<String, String>으로 <키, 값>을 받을 수 있습니다.

Map<키, 값>으로 받지 않고 Class Object로 Deserialization하고 싶으시면 다음과 같이 inner class를 사용할 수도 있습니다.
public static class Data {
@SerializedName("")
public String path;
@SerializedName("")
public String size;
}
class Albums {
@SerializedName("")
public String title;
@SerializedName("")
public String message;
@SerializedName("")
public ArrayList<String> items = new ArrayList<String>();
@SerializedName("")
public Data data = new Data();
}
이때 주의해야 할 점은 inner class는 static이어야 한다는 점 입니다.

이 외에도 주의할 점을 정리하면 
  • 기본적으로 Serialize할때 변수가 null이면 json에 해당 항목이 빠진다. 
            String json = new GsonBuilder().serializeNulls().create().toJson(obj);​ 로 null도 포함시킬 수 있습니다.
  • inner class는 static 클래스만 사용 가능하다.
  • generic type 사용 가능하다.
  • private 맴버 변수도 set/get 함수없이도 변환 가능하다.
  • 기본적으로 클래스의 모든 맴버 변수들은 직렬화/역직렬화 대상이다. (제외시 annoation을 사용한다)

정도가 될 것 같습니다.


반응형