java - gson.toGson() 不调用自定义序列化方法

标签 java json serialization deserialization

我有一个抽象类和一组具体类。

class AbstractClass {
..
}

class ConcreteClass extends AbstractClass {
..
}

我有一个实现了 JsonSerializer 和 JsonDeserializer 的自定义适配器

public class AbstractClassAdaptor implements JsonSerializer<AbstractClass>, JsonDeserializer<AbstractClass> {


@Override 
public JsonElement serialize(AbstractClass src, Type typeOfSrc, JsonSerializationContext context) {
  JsonObject result = new JsonObject();
  result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));
  result.add("properties", context.serialize(src, src.getClass()));
  return result;
}
@Override
public AbstractClass deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

  JsonObject jsonObject = json.getAsJsonObject();
  String type = jsonObject.get("type").getAsString();
  JsonElement element = jsonObject.get("properties");
    try {
       return context.deserialize(element, Class.forName("com.myjson." + type));
    } catch (ClassNotFoundException cnfe) {
       throw new JsonParseException("Unknown element type: " + type, cnfe);
}

}

//测试 block

Gson gson =  new GsonBuilder().registerTypeAdapter(AbstractClass.class, new AbstractClassAdaptor()).create();

AbstractClass obj = new ConcreteClass();
String jsonString = gson.toJson(obj);

未调用 AbstractClassAdaptor 中的 Serialize 方法。这从 json 输出中可以明显看出,它在序列化后不包含任何类型和属性的痕迹。

最佳答案

实现此功能的一种方法(也是迄今为止我使用的唯一一种方法)是将所需类型传递给 toJson 方法。所以

String jsonString = gson.toJson(obj, AbstractClass.class);

将在 AbstractClassAdaptor 中调用您自定义的序列化程序。同样,您需要在反序列化时这样做。

关于java - gson.toGson() 不调用自定义序列化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28123337/

相关文章:

java - 获取 Eclipse 编辑器的当前源代码?

java - 网络/数据库作业的足够线程数

java - RestAssured - 如何从 json 响应中读取数组元素

javascript - 计算 json 数据以在 highchart 折线图中创建动态系列

javascript - 如何通过为每个对象指定过滤器类型来过滤 AngularJS 中的对象?

java - 在 Java 中序列化 Canvas 对象

visual-studio-2010 - SQL Server 未找到序列化程序集

java - 用 Java 从文件中完全读取对象流的最佳方法是什么?

Java 异常没有被捕获?

java - WebTarget 类型中的方法 request(String...) 不适用于参数 (MediaType)