java - 使用 gson 反序列化接口(interface)数据无法取回值?

标签 java gson

我正在下面运行一个简单的实验测试。

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/

相关文章:

java - 如何在用户不登录的情况下在我的网络应用程序中获取 Quickbooks 在线数据

java - Jackson JSON 反序列化为 java.util.Date 不起作用

java - org.hibernate.MappingException : Could not determine type for

java - Gradle 卡在 Android Studio 中构建项目

java - Gson 将 "null"对象解析为数组/对象?

java - Java中获取注解元数据的方法

java.lang.IllegalStateException : Expected BEGIN_ARRAY but was BEGIN_OBJECT Android error 错误

java gson在序列化时替换密码值

java - 如何将json字符串反序列化为对象

java - 如何将类<T>对象的Map转换为json java