gson 如何将json字符串反序列化为不同的特定java对象?

cngwdvgl  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(271)

我设法使用gson将一个极其复杂的类(它嵌套了50个自定义的java对象)序列化为json字符串。

public class MyComplexObject{
     private int a;
     private String b;
     private MyclassA c;
     ...
     private map<String, Object> x;
}

请注意,对于字段private map<String, Object> x,值Object可以是IntegerDoubleStringmyClassC等....在序列化时它工作得很好,但在反序列化时,gson无法按照我的预期转换json字符串。
我的班级C:

public class MyclassC{
    public String d;
    public List<Integer> e;
}

下面是一个示例:

MyComplexObject myComplexObject = new MyComplexObject();
myComplexObject.seta(1);
myComplexObject.setb("abc");

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
MyClassC myClassC = new MyClassC("key1", list);
myComplexObject.setx(myClassC);

// Serializing and Deserializing
String myComplexObjectStr = gson.toJson(myComplexObject);
MyComplexObject myComplexObject2 = gson.fromJson(myComplexObjectStr, MyComplexObject.class);

// after deserializing, x has been converted to LinkedTreeMap
myComplexObject.x.getClass();   // class MyClassC
myComplexObject2.x.getClass();   // class com.google.gson.internal.LinkedTreeMap

// Go further about the field x

Object object = myComplexObject2.x.get("key1");

LinkedTreeMap linkedTreeMap = (LinkedTreeMap) object;
ArrayList arrayList = (ArrayList) linkedTreeMap.get("e");

arrayList.get(0).getClass(); // class java.lang.Double

因此,在序列化和反序列化之后:

  1. MyClassC已转换为LinkedTreeMap
    1.列表已转换为列表
    所以我的问题是:我应该怎么做才能确保MyComplexObject在序列化和反序列化之后完全相同?
c9qzyr3d

c9qzyr3d1#

当反序列化Gson为Object的JSON数字时,默认情况下将JSON值反序列化为JavaDouble(正如你所看到的)。最近在Gson 2.8.9中增加了一个新特性,允许指定ToNumberStrategy。这允许你更容易地影响Gson反序列化JSON数字的方式。一些默认的实现是由ToNumberPolicy枚举提供的。最接近您的需求的是ToNumberPolicy.LONG_OR_DOUBLE。如果您确实需要Integer作为值类型,可以尝试编写类似于Gson的实现。

相关问题