gpt4 book ai didi

java - Gson在json中存储对象类型

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:42 24 4
gpt4 key购买 nike

我需要将对象从一个套接字发送到另一个套接字,并且我想使用 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;
}
}

理论上,这是可行的,但是当我尝试序列化嵌套对象时,它会失败,就像这样

class MyType {
AnotherType anotherType;
}

因为只有MyType将被包装,生成的 json 将如下所示:

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

是否可以像这样序列化对象及其类型?

最佳答案

This answer描述了如何解决这个问题。它不使用Gson,而是Genson反而。我不太喜欢 Genson 处理 Pojos 的方式,但我想我必须忍受这一点。

关于java - Gson在json中存储对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45394932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com