GSON:使用ReflectiveTypeAdapterFactory.Adapter序列化/反序列化具有已注册类型层次结构适配器的类的对象

要清楚,让我们介绍一些模型:

interface A { boolean isSomeCase(); } class AAdapter implements JsonSerializer { public JsonElement serialize(A src, Type typeOfSrc, JsonSerializationContext context) { if (src.isSomeCase()) { /* some logic */ return result; } else { JsonObject json = new JsonObject(); JsonElement valueJson = ; // TODO serialize src like POJO json.add(src.getClass().getSimpleName(), valueJson); return json; } } } Gson gson = new GsonBuilder() .registerTypeHierarchyAdapter(A.class. new AAdapter()) .create(); 

如何通过ReflectiveTypeAdapterFactory.Adapter序列化,实现A一些实例,即isSomeCase() = false ,就像任何其他对象一样。

您可以编写自定义的TypeAdapterFactory并在其TypeAdapter的write()方法中处理传入对象的isSomeCase()结果,并在那里应用您的逻辑:

 public class ATypeAdapterFactory implements TypeAdapterFactory { public TypeAdapter create(Gson gson, TypeToken type) { if (!A.class.isAssignableFrom(type.getRawType())) { // Check if incoming raw type is an instance of A interface return null; } final TypeAdapter delegate = gson.getDelegateAdapter(this, type); return new TypeAdapter() { @Override public void write(JsonWriter out, A value) throws IOException { if(value.isSomeCase()) { // your custom logic here out.beginObject(); out.name("x").value(0); out.endObject(); } else { // default serialization here delegate.write(out, value); } } @Override public A read(JsonReader in) throws IOException { return delegate.read(in); } }; } } 

测试:

 final GsonBuilder gsonBuilder = new GsonBuilder(); // Register custom type adapter factory gsonBuilder.registerTypeAdapterFactory(new ATypeAdapterFactory()); final Gson gson = gsonBuilder.create(); A aSomeCaseTrue = new AImpl(true); System.out.print("aSomeCaseTrue:" + gson.toJson(aSomeCaseTrue)); // writes; aSomeCaseTrue:{"x":0} A aSomeCaseFalse = new AImpl(false); System.out.print("aSomeCaseFalse:" + gson.toJson(aSomeCaseFalse);); // writes; aSomeCaseFalse:{"someCase":false} 

附加function:

1)您的界面:

 interface A { boolean isSomeCase(); } 

2)实现示例接口的示例类:

 class AImpl implements A { boolean someCase; public AImpl(boolean value) { this.someCase = value; } @Override public boolean isSomeCase() { return someCase; } }