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

3

我有以下代码片段:

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?

1
你正在传递的 otherObject 是什么?能否展示一个小例子以及 JSON 的结果是什么? - Aviad
我正在删除Spring标签,如果您确实需要它,请将其添加回去,但在问题中包含一些关于它与该标签相关的信息。 - weston
3个回答

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

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


-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


他们遇到的问题在反序列化方面。 - weston
谢谢,但问题在于当我反序列化父对象时,子对象是LinkedHashMap,而不是像我需要的那样具有AnotherClass实例的对象。 - avalon
我无法创建一个接口,在resultValue中可能有任何类型的对象。我认为有一种方法可以从实例中确定实际类型。 - avalon
1
很不幸,这是不可能的。目的是什么?你想要实现什么?也许有其他解决方案。 - Aviad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接