使用Gson进行对象字段反序列化

时间:2016-01-06 07:05:45

标签: java json gson

我有以下代码段:

public class MyClass{

private Object returnValue;

//getters setters

}

Gson gson=...;
MyClass cl=new MyClass();

cl.setResultValue(***new OtherClass()***);

gson.toJson(cl,MyClass.class);

当我尝试反序列化时,我需要在returnValue字段中观察OtherClass实例,但我在那里得到LinkedHashMap。我理解这可能是因为Object字段类型,但是如何强制它获取实际类型的对象,而不仅仅是Object?

3 个答案:

答案 0 :(得分:0)

您可以使用泛型实现它。

首先让您将类归类如下:

public class MyClass<T>{

    private T returnValue;

    public T getReturnValue(){
        return returnValue;
    }
    public void setReturnValue(T returnValue){
        this.returnValue = returnValue;
    }    
}

之后,您可以使用Type反序列化json:

public static void main(String[] args){
    Gson gson = new Gson();
    MyClass<OtherClass> myClass = new MyClass<>();
    myClass.setReturnValue(new OtherClass());
    //serialization
    String json = gson.toJson(myClass);    
    Type type = new TypeToken<MyClass<OtherClass>>
    MyClass<OtherClass> deserializedClass = gson.fromJson(json, type);
}

答案 1 :(得分:-1)

查看我已完成的下一个流程

public class SomeClass {

    private int x;
    private Object object;

    public SomeClass(Object object) {
        this.object = object;
    }

}

public class AnotherClass {

    private String test;
    private int y;

    public AnotherClass() {
        test = "dsadas";
        y = 5;
    }

}

当我在做下一个时:

gson.toJson(new SomeClass(new AnotherClass()));

结果是:{“x”:0,“object”:{“test”:“dsadas”,“y”:5}}

正如你所看到的,这种方式很好用

编辑: 在反序列化的情况下,存在已知问题并处理这种情况。 gson不知道将json转换为什么的问题。所以你必须在gson中发送你想要解析它的类型并构建deserizaler。

更常见的是为这个其他类创建接口。所以你可以标记它。我们来说IOtherClass

现在,IOtherClass的其中一个字段将是TYPE。

您需要为IOtherClass构建deseriaze,然后您将根据类型进行转换。 这是告诉gson要解析什么的唯一方法

查看此主题:How to handle deserializing with polymorphism?

这一个:Gson serialize a list of polymorphic objects

答案 2 :(得分:-1)

我没有找到任何优雅的解决方案,所以我决定处理内部LinkedHashMap并手动处理它。感谢