Gson
new Gson()
을 호출하여 Gson인스턴스 생성이 가능하다.GsonBuilder
라는 클래스를 사용하여 Gson 인스턴스를 여러가지 세팅 사용 생성하는데 가능하다.- Serializable
Gson gson = new Gson();
gson.toJson(1); // 1
gson.toJson("abcd"); //"abcd"
gson.toJson(new Long(10)); //10
int[] values = {1};
gson.toJson(values) // [1]
- Deserializable
int one = gson.fromJson("1", int.class);
Integer one = gson.fromJson("1", Integer.class);
Long one = gson.fromJson("1",Long.class);
//
class BagOfPrimitives {
private int value1 = 1;
private String value2 = "abc";
private transient int value3 = 3;//transient는 직렬화를 하지않도록하는 키워드
BagOfPrimitives() {
// no-args constructor
}
}
// Serialization
BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);
//value3는 직렬화되지 않는다.
// ==> json is {"value1":1,"value2":"abc"}
무한 재귀 발생으로 순환 참조로 객체를 직렬화 할 수 없을 수 있다.
// 역 직렬화
BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
// ==> obj2 is just like obj
class Foo<T> {
T value;
}
Gson gson = new Gson();
Foo<Bar> foo = new Foo<Bar>();
gson.toJson(foo); // foo.value는 올바르게 직렬화되지 않습니다.
gson.fromJson(json, foo.getClass()); // foo.value를 Bar로 역직렬화하는데 실패합니다.
위의 코드는 값을 Bar Type으로 해석하는데 실패한다.
🤷 왜냐? Gson은 받은 객체의 클래스 정보를 얻기 위해 foo.getClass() 를 호출하는데, 이 메서드는 처리되지 않은 클래스인 Foo.class를 반환하기 때문이다.
generic type을 위한 올바른 매개변수용 type을 지정함으로 이 문제를 해결할 수 있다. 그러기 위해 TypeToken 클래스를 사용할 수 있다.
Type fooType = new TypeToken<Foo<Bar>>() {}.getType();
gson.toJson(foo, fooType);
gson.fromJson(json, fooType);
실제로 footype을 얻기위해 사용되는 idiom은 getType()메서드를 갖는 익명 로컬 inner 클래스를 정의한다. getType()메서드는 완전환 매개변수화된 type을 반환한다.
간단하게만 공식문서를 살펴보았는데 제대로 파고들면 쉽지 않을 것 같다.
꾸준히 개념 정리를 해야하는 부분이다.😅