Java Gson在json中存储对象类型

Java Gson在json中存储对象类型,java,json,serialization,gson,Java,Json,Serialization,Gson,我需要将对象从一个套接字发送到另一个套接字,并希望使用JSON进行序列化每个json对象都必须存储其类型。我的计划是包装我的物品: { /* the type */ "_type_": "my.package.MyClass", /* the actual object */ "_data_": { ... } } 我试图通过编写这个序列化适配器来实现这一点 Gson gson = new GsonBuilder().registerTypeAdapter(Wra

我需要将对象从一个套接字发送到另一个套接字,并希望使用JSON进行序列化每个json对象都必须存储其类型。我的计划是包装我的物品:

{
   /* the type */ "_type_": "my.package.MyClass",
   /* the actual object */ "_data_": {
      ...
   }
}
我试图通过编写这个序列化适配器来实现这一点

Gson gson = new GsonBuilder().registerTypeAdapter(Wrapper.class, new ObjectWrapperAdapter()).create();
gson.toJson(new Wrapper(myObject), Wrapper.class);

private static class ObjectWrapperAdapter implements JsonSerializer<Wrapper>, JsonDeserializer<Wrapper> {
    private static final String TYPE_KEY = "__type__";
    private static final String DATA_KEY = "__data__";

    @Override
    public Wrapper deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
        if(!json.isJsonObject()) throw new JsonParseException("element is not an object!");
        JsonObject object = json.getAsJsonObject();
        if(!object.has(TYPE_KEY)) throw new JsonParseException(TYPE_KEY + " element is missing!");
        if(!object.has(DATA_KEY)) throw new JsonParseException(DATA_KEY + " element is missing!");
        JsonElement dataObject = object.get(DATA_KEY);
        String clazzName = object.get(TYPE_KEY).getAsString();
        Class<?> clazz = classForName(clazzName);
        return new Wrapper(context.deserialize(dataObject, clazz));
    }

    private Class<?> classForName(String name) throws JsonParseException {
        try {
            return Class.forName(name);
        } catch (ClassNotFoundException e) {
            throw new JsonParseException(e);
        }
    }

    @Override
    public JsonElement serialize(Wrapper src, Type type, JsonSerializationContext context) {
        JsonObject wrapper = new JsonObject();
        Object data = src.object;
        JsonElement dataElement = context.serialize(data);
        String className = data.getClass().getName();
        wrapper.addProperty(TYPE_KEY, className);
        wrapper.add(DATA_KEY, dataElement);
        return wrapper;
    }
}

public static class Wrapper {
    private final Object object;

    public Wrapper(Object object) {
        this.object = object;
    }
}
因为只有
MyType
将被包装,生成的json将如下所示:

{
    "__type__": "my.package.MyType",
    "__data__": {
        (No "__type__" field here...)
        ...
    }
}

是否可以用这样的类型序列化对象?

介绍了如何解决此问题。它不使用Gson,而是使用Gson。我真的不喜欢Genson处理Pojo的方式,但我想我不得不接受它。

描述了如何解决这个问题。它不使用Gson,而是使用Gson。我真的不喜欢Genson处理Pojo的方式,但我想我不得不接受这一点。

看起来你正在试图解决与之类似的问题。你能检查一下,让我们知道当前的问题是否重复吗?@SergeyBrunov不太可能。我需要一个适用于每种类型的解决方案/我不知道哪些类型将被序列化…很好,我明白了重点。你能看看这些吗:,?@SergeyBrunov Genson提供了我想要的功能。非常感谢你!真遗憾,我没有自己找到那篇文章。很高兴它帮助了你!一点也不丢脸,我们是来互相帮助的。看起来你们在试图解决一个类似的问题。你能检查一下,让我们知道当前的问题是否重复吗?@SergeyBrunov不太可能。我需要一个适用于每种类型的解决方案/我不知道哪些类型将被序列化…很好,我明白了重点。你能看看这些吗:,?@SergeyBrunov Genson提供了我想要的功能。非常感谢你!真遗憾,我没有自己找到那篇文章。很高兴它帮助了你!一点也不丢脸,我们是来互相帮助的。你不喜欢盖斯农处理波乔的方式吗?这和格森或杰克逊处理他们的方式非常相似。你不喜欢格森处理波乔的方式吗?这与Gson或Jackson处理它们的方式非常相似。
{
    "__type__": "my.package.MyType",
    "__data__": {
        (No "__type__" field here...)
        ...
    }
}