Gson을 사용하면 JSON 표현에서 객체를 직렬화 및 비 직렬화 할 수 있습니다. Gson은 일반 객체를 처리 할 수있는 직렬 및 디시리얼라이저를 내장했지만 특별한 것이 필요하면 직접 구현할 수 있습니다. 이 질문에서 언급 한 예제에서, 클래스가 인수없는 생성자를 가지고 있다면 generic serializer와 deserializers가 작동 할 것입니다.
public class Person {
private String name;
private int age;
private Person parent = null;
public Person() {
// Required no-args constructor for Gson.
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
직렬화 즉 무한 재귀의 원인이되므로 당신은 순환 참조와 객체를 직렬화 할 수
Person joe = new Person("Joe", 20);
Gson gson = new Gson();
String json = gson.toJson(joe);
==> json is {"name":"Joe","age":"20"}
참고 :
간단한 방법은 다음과 같이이 무엇을해야합니다 . 또한 부모가 무기한으로 인스턴스화되기 때문에 질문에 제공된 예제는 불가능합니다.
역 직렬화
Person joe = gson.fromJson(json, Person.class);
이 이상의 어떤 정의가 필요한 경우, 당신은 사용자 정의 직렬화 및 역 직렬화를 사용할 수 있습니다. user guide에서 :
사용자 정의 직렬화 및 역 직렬화
때로는 기본 표현은 당신이 원하는 없습니다. 라이브러리 클래스 (DateTime 등)를 처리 할 때는 대개 입니다. Gson 을 사용하면 사용자 지정 serializer 및 deserializers를 등록 할 수 있습니다. Json Serialiers : 객체에 대한 사용자 정의 직렬화 사용자 정의 직렬화 : 유형에 대한 사용자 정의 직렬화 정의 인스턴스 작성자 : 필요 없음 인수 없음 생성자를 사용할 수 있거나 직 병렬 변환기가있는 경우 등록
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(MyType2.class, new MyTypeAdapter());
gson.registerTypeAdapter(MyType.class, new MySerializer());
gson.registerTypeAdapter(MyType.class, new MyDeserializer());
gson.registerTypeAdapter(MyType.class, new MyInstanceCreator());
registerTypeAdapter 호출 체크 형 어댑터가 이러한 인터페이스 하나 이상을 구현하고 이들 모두를 등록하는 경우. 시리얼 라이저 여기
작성
는 JodaTime 날짜 시간 클래스에 대한 사용자 지정 serializer를 작성하는 방법의 예입니다.
private class DateTimeSerializer implements JsonSerializer<DateTime> {
public JsonElement serialize(DateTime src, Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src.toString());
}
}
GSON이 toJson()를 호출은 직렬화시에 DateTime 개체로 실행할 때. 디시리얼라이저
작성
여기 JodaTime 날짜 시간 클래스에 대한 사용자 정의 디시리얼라이저를 작성하는 방법의 예입니다.
private class DateTimeDeserializer implements
JsonDeserializer<DateTime> {
public DateTime deserialize(JsonElement
json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return new DateTime(json.getAsJsonPrimitive().getAsString());
}
}
GSON은 당신이 직렬화 도착을 제어 할 수 있습니다
DateTime 개체로 JSON 문자열 조각을 역 직렬화 할 필요가 fromJson()를 호출하여 어떤 형태의 인터페이스 에게 java.io.Externalizable의 그러나 그것을 사용 기본 생성자를 사용하여 직렬화 해제 할 때 객체를 만들 것이므로 특정 생성자를 사용하도록 지시 할 방법이 없다고 생각합니다. 직접 할 수있는 유일한 방법은 독자적으로 직렬화를 수행하는 것입니다. –