Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用gson反序列化接口数据不返回值?_Java_Gson - Fatal编程技术网

Java 使用gson反序列化接口数据不返回值?

Java 使用gson反序列化接口数据不返回值?,java,gson,Java,Gson,我在下面做一个简单的实验测试 public class MyTest { @Test public void testing() { GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(SubData.class, new SubDataImplInstanceCreator()); Gson gson = builder.create();

我在下面做一个简单的实验测试

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":{}}

为什么在反序列化Json字符串之后,我会丢失我的
子数据
值?我的代码中遗漏了什么吗?

您似乎已经找到了这个问题,建议的解决方案是在接口中使用TypeAdapter

快速而肮脏的实现(使用它代替SubDataImplInstanceTypeAdapter)

public类subdataimpleInstanceTypeAdapter实现JsonDeserializer、JsonSerializer{
@凌驾
public SubDataImpl反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
SubDataImpl impl=新的SubDataImpl();
JsonObject object=json.getAsJsonObject();
impl.setHello(object.get(“hello”).getAsString();
返回impl;
}
@凌驾
公共JsonElement序列化(SubDataImpl src,类型typeOfSrc,JsonSerializationContext){
返回context.serialize(src);
}
}
我正在使用下面的

public class MyTest {
    @Test
    public void testing() {
        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(SubData.class, new SubDataTypeAdapter());
        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 SubDataTypeAdapter extends TypeAdapter<SubDataImpl> {

        @Override
        public void write(JsonWriter out, final SubDataImpl subData) throws IOException {
            out.beginObject();
            out.name("hello").value(subData.getHello());
            out.endObject();
        }

        @Override
        public SubDataImpl read(JsonReader in) throws IOException {
            final SubDataImpl subData = new SubDataImpl();

            in.beginObject();
            while (in.hasNext()) {
                switch (in.nextName()) {
                    case "hello":
                        subData.hello = in.nextString();
                        break;
                }
            }
            in.endObject();

            return subData;
        }
    }

    class Dataclass implements Serializable {
        String key1;
        SubData sub;
    }

    abstract class SubData {
        abstract String getHello();
    }

    class SubDataImpl extends SubData implements Serializable {

        String hello;

        @Override
        public String getHello() {
            return hello;
        }
    }
}
公共类MyTest{
@试验
公开无效测试(){
GsonBuilder=新的GsonBuilder();
registerTypeAdapter(SubData.class,新的SubDataTypeAdapter());
Gson Gson=builder.create();
Dataclass数据=新的Dataclass();
data.key1=“abc”;
SubDataImpl subData=新的SubDataImpl();
subData.hello=“ttt”;
data.sub=子数据;
字符串jsonValue=gson.toJson(数据);
System.out.println(jsonValue);
Dataclass data2=gson.fromJson(jsonValue,Dataclass.class);
System.out.println(gson.toJson(data2));
}
类SubDataTypeAdapter扩展了TypeAdapter{
@凌驾
public void write(JsonWriter out,final SubDataImpl subData)抛出IOException{
out.beginObject();
out.name(“hello”).value(subData.getHello());
out.endObject();
}
@凌驾
public SubDataImpl read(JsonReader in)引发IOException{
final SubDataImpl subData=new SubDataImpl();
in.beginObject();
while(在.hasNext()中){
开关(在.nextName()中){
案例“你好”:
subData.hello=in.nextString();
打破
}
}
in.endObject();
返回子数据;
}
}
类Dataclass实现可序列化{
字符串键1;
子数据子;
}
抽象类子数据{
抽象字符串getHello();
}
类SubDataImpl扩展子数据实现可序列化{
串你好;
@凌驾
公共字符串getHello(){
回复你好;
}
}
}

很酷。你的工作。我还使用下面的方法实现了它。
 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);
    }
}
public class MyTest {
    @Test
    public void testing() {
        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(SubData.class, new SubDataTypeAdapter());
        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 SubDataTypeAdapter extends TypeAdapter<SubDataImpl> {

        @Override
        public void write(JsonWriter out, final SubDataImpl subData) throws IOException {
            out.beginObject();
            out.name("hello").value(subData.getHello());
            out.endObject();
        }

        @Override
        public SubDataImpl read(JsonReader in) throws IOException {
            final SubDataImpl subData = new SubDataImpl();

            in.beginObject();
            while (in.hasNext()) {
                switch (in.nextName()) {
                    case "hello":
                        subData.hello = in.nextString();
                        break;
                }
            }
            in.endObject();

            return subData;
        }
    }

    class Dataclass implements Serializable {
        String key1;
        SubData sub;
    }

    abstract class SubData {
        abstract String getHello();
    }

    class SubDataImpl extends SubData implements Serializable {

        String hello;

        @Override
        public String getHello() {
            return hello;
        }
    }
}