我设法使用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
可以是Integer
、Double
、String
、myClassC
等....在序列化时它工作得很好,但在反序列化时,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
因此,在序列化和反序列化之后:
- MyClassC已转换为LinkedTreeMap
1.列表已转换为列表
所以我的问题是:我应该怎么做才能确保MyComplexObject
在序列化和反序列化之后完全相同?
1条答案
按热度按时间c9qzyr3d1#
当反序列化Gson为
Object
的JSON数字时,默认情况下将JSON值反序列化为JavaDouble
(正如你所看到的)。最近在Gson 2.8.9中增加了一个新特性,允许指定ToNumberStrategy
。这允许你更容易地影响Gson反序列化JSON数字的方式。一些默认的实现是由ToNumberPolicy
枚举提供的。最接近您的需求的是ToNumberPolicy.LONG_OR_DOUBLE
。如果您确实需要Integer
作为值类型,可以尝试编写类似于Gson的实现。