我正在下面运行一个简单的实验测试。
public class MyTest {
@Test
public void testing() {
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(SubData.class, new SubDataImplInstanceCreator());
Gson gson = builder.create();
Dataclass data = new Dataclass();
data.key1 = "abc";
SubDataImpl subData = new SubDataImpl();
subData.hello = "ttt";
data.sub = subData;
String jsonValue = gson.toJson(data);
System.out.println(jsonValue);
Dataclass data2 = gson.fromJson(jsonValue, Dataclass.class);
System.out.println(gson.toJson(data2));
}
class Dataclass implements Serializable {
String key1;
SubData sub;
}
interface SubData {
String getHello();
}
class SubDataImpl implements SubData, Serializable {
String hello;
@Override
public String getHello() {
return hello;
}
}
public class SubDataImplInstanceCreator implements InstanceCreator<SubDataImpl> {
@Override
public SubDataImpl createInstance(Type type) {
return new SubDataImpl();
}
}
}
我期待它回来
{"key1":"abc","sub":{"hello":"ttt"}}
{"key1":"abc","sub":{"hello":"ttt"}}
因为它们本质上是序列化和反序列化的相同数据。
但是,当我运行它时,我得到了
{"key1":"abc","sub":{"hello":"ttt"}}
{"key1":"abc","sub":{}}
为什么在反序列化 Json 字符串后我丢失了 SubData
值?我的代码中遗漏了什么吗?
最佳答案
看来你已经击中了这个bug ,建议的解决方案是为接口(interface)使用 TypeAdapter。
快速而肮脏的实现(用它代替SubDataImplInstanceTypeAdapter)
public class SubDataImplInstanceTypeAdapter implements JsonDeserializer<SubDataImpl>, JsonSerializer<SubDataImpl> {
@Override
public SubDataImpl deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
SubDataImpl impl = new SubDataImpl();
JsonObject object = json.getAsJsonObject();
impl.setHello(object.get("hello").getAsString());
return impl;
}
@Override
public JsonElement serialize(SubDataImpl src, Type typeOfSrc, JsonSerializationContext context) {
return context.serialize(src);
}
}
关于java - 使用 gson 反序列化接口(interface)数据无法取回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49870055/