Bạn cần đăng ký cả JSONSerializer và JSONDeserializer. Ngoài ra, bạn có thể triển khai bộ điều hợp chung cho tất cả các giao diện của mình theo cách sau:
- Trong quá trình tuần tự hóa: Thêm thông tin META của loại lớp impl thực tế.
- Trong deserialization: Lấy rằng thông tin meta và gọi JSONDeserailize đó lớp
Đây là việc thực hiện mà tôi đã sử dụng cho bản thân mình và hoạt động tốt.
public class PropertyBasedInterfaceMarshal implements
JsonSerializer<Object>, JsonDeserializer<Object> {
private static final String CLASS_META_KEY = "CLASS_META_KEY";
@Override
public Object deserialize(JsonElement jsonElement, Type type,
JsonDeserializationContext jsonDeserializationContext)
throws JsonParseException {
JsonObject jsonObj = jsonElement.getAsJsonObject();
String className = jsonObj.get(CLASS_META_KEY).getAsString();
try {
Class<?> clz = Class.forName(className);
return jsonDeserializationContext.deserialize(jsonElement, clz);
} catch (ClassNotFoundException e) {
throw new JsonParseException(e);
}
}
@Override
public JsonElement serialize(Object object, Type type,
JsonSerializationContext jsonSerializationContext) {
JsonElement jsonEle = jsonSerializationContext.serialize(object, object.getClass());
jsonEle.getAsJsonObject().addProperty(CLASS_META_KEY,
object.getClass().getCanonicalName());
return jsonEle;
}
}
Sau đó, bạn có thể đăng ký chuyển đổi này cho tất cả các giao diện của bạn như sau
Gson gson = new GsonBuilder()
.registerTypeAdapter(IInterfaceOne.class,
new PropertyBasedInterfaceMarshal())
.registerTypeAdapter(IInterfaceTwo.class,
new PropertyBasedInterfaceMarshal()).create();
Nguồn
2012-02-02 02:29:05
Hãy xem [http://stackoverflow.com/a/22081826/3315914] (http://stackoverflow.com/a/22081826/3315914) – rpax