반응형
gson이 사용자 지정 역직렬화에서 표준 역직렬화를 호출함
먼저 기본 동작을 호출하는 json deserializer를 gson에 쓴 후 오브젝트에 대한 후처리를 할 수 있습니까?예를 들어 다음과 같습니다.
public class FooDeserializer implements JsonDeserializer<Foo> {
public Foo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Foo foo = context.deserialize(json, typeOfT);//Standard deserialization call?????
foo.doSomething();
return foo();
}
}
gson 1.3을 사용하고 있습니다(회사 저장소 버전만 사용할 수 있기 때문에 다른 버전은 사용할 수 없습니다).
감사해요.
이를 수행하려면 다음과 같이 CustomClass.class 라고 하는 오브젝트에 커스텀 TypeAdapterFactory 를 실장합니다.
public class CustomTypeAdapterFactory implements TypeAdapterFactory {
public final TypeAdapter create(Gson gson, TypeToken type) {
return new TypeAdapter() {
@Override
public void write(JsonWriter out, Object value) throws IOException {
JsonElement tree = delegate.toJsonTree(value);
//add code for writing object
}
@Override
public Object read(JsonReader in) throws IOException {
JsonElement tree = elementAdapter.read(in);
//Add code for reading object
}
};
}
}
그리고 Gson에 등록합니다.
Gson gson = new GsonBuilder().registerTypeAdapter(CustomClass.class,new CustomTypeAdapterFactory()).create();
public class FooDeserializer implements JsonDeserializer<Foo> {
public Foo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Foo foo=new Gson().fromJson(json, Foo.class); // use default Gson object
foo.doSomething();
return foo;
}
http://gsonfire.io 를 확인해 주세요.
Gson을 확장하여 포스트시리얼라이제이션이나 포스트디시리얼라이제이션 등의 케이스를 처리하는 라이브러리입니다.
또한 Gson과 함께 오랜 시간 동안 필요했던 많은 멋진 기능들을 가지고 있습니다.
public class YourDeserializer<Foo> extends FooDeserializer<Foo>
{
public Foo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Foo foo = super.deserialize(json, typeOfT,context);
foo.doSomething(); //put logic
return foo();
}
}
여기에서는 @user and6622에 의한 불완전한 답변과 code.google.com/p/google-gson/issues/detail?id=43에서의 논의를 바탕으로 완전한 구현을 실시합니다.
그 결과, 추상 목록을 직렬화할 수 있습니다.Field
특정의 구체적인 구현에 의존하지 않고 오브젝트를 매끄럽게 역직렬화Field
계층 심도.
class MyClass { //class which we would like to serialiaze/deserialize
List<Field> fields; //field is an hierarchy of classes
}
/**
* Purpose of this adapter is simple:
* 1) put during serialization in all Field objects additional property describing class
* 2) during deserialization invoke (based on class info) necessary deserializer to create class
*/
public class FieldTypeAdapterFactory implements TypeAdapterFactory {
private static final String CLASS_META_KEY="clz";
Gson gson;
TypeToken<?> type;
TypeAdapter<Field> fieldAdapter;
TypeAdapter<JsonElement> elementAdapter;
TypeAdapterFactory taf;
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (!Field.class.isAssignableFrom(type.getRawType()))
return null; // this class only serializes 'Field' and its subtypes
this.type=type;
this.gson=gson;
this.taf=this;
fieldAdapter = gson.getDelegateAdapter(taf, TypeToken.get(Field.class));
elementAdapter = gson.getAdapter(JsonElement.class);
TypeAdapter<T> result = new FieldTypeAdapter<T>();
result.nullSafe();
return result;
}
class FieldTypeAdapter<T> extends TypeAdapter<T> {
public FieldTypeAdapter() {
}
@Override
public void write(JsonWriter out, Object value) throws IOException {
if(value instanceof Field) {
JsonObject object = fieldAdapter.toJsonTree((Field )value).getAsJsonObject();
object.addProperty(CLASS_META_KEY, value.getClass().getCanonicalName());
elementAdapter.write(out, object);
}
else {
elementAdapter.write(out, (JsonElement) value);
}
}
@Override
public T read(JsonReader in) throws IOException {
JsonObject object = elementAdapter.read(in).getAsJsonObject();
if (object.has(CLASS_META_KEY)) {
String className=object.get(CLASS_META_KEY).getAsString();
try {
Class<?> clz = Class.forName(className);
TypeAdapter<?> adapter = gson.getDelegateAdapter(taf, TypeToken.get(clz));
return (T) adapter.fromJsonTree(object);
}
catch (Exception e) {
return (T )fieldAdapter.fromJsonTree(object);
}
}
else
return (T )elementAdapter.fromJsonTree(object);
}
}
}
공장 등록:
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(new FieldTypeAdapterFactory())
.create();
언급URL : https://stackoverflow.com/questions/3932671/gson-invoking-standard-deserialization-in-custom-deserializer
반응형
'programing' 카테고리의 다른 글
헤더 값: application/vnd.api+json (0) | 2023.03.29 |
---|---|
악성코드가 CORS를 악용하기 위해 "Origin" 헤더를 스푸핑하는 것을 방지하려면 어떻게 해야 합니까? (0) | 2023.03.29 |
jQuery 클릭 이벤트가 Angular 내에서 발생하지 않음JS 템플릿 (0) | 2023.03.29 |
어레이에서 $$hashKey 제거 (0) | 2023.03.29 |
리액트 linter Airbnb proptypes 어레이 (0) | 2023.03.29 |