我有一个物体里面有一张Map:
MyDTO
HashMap<Integer>
现在,当我将mydto转换为json(使用gson),然后从json转换回mydto时,我得到的是 HashMap<String>
.
我将json转换回如下对象:
MyDTO dto = gson.fromJson(json, MyDTO.class);
如何强制它将Map转换/保留在dto中 Map<Integer>
而不是 Map<String>
?
这是我的目标:
public class MultiSeriesTimebasedChartDTO implements Serializable
{
LinkedHashMap<String, ArrayList<Number>> data;
}
下面是如何将json转换回对象:
multiSeriesTimebasedChartDTO = gson.fromJson(json, MultiSeriesTimebasedChartDTO.class);
这是结果(截图),原来是数字,现在是字符串。我需要它们作为数字回来。
因此,寻找一个干净的方法。
我绝对可以迭代它,把每个数字从字符串改回数字,然后替换它。。。但我在想也许还有其他更好的方法。
2条答案
按热度按时间8iwquhpp1#
这些值仍然是
java.lang.Number
在解析json之后。但是,因为您的字段具有LinkedHashMap<String, ArrayList<Number>>
,gson使用其内部类型LazilyParsedNumber
因为它不能知道你想要哪种特定的类型Number
要解析的。lazlyparsednumber充当json字符串表示的 Package 器,因此可以调用相应的Number
方法来分析值。如果只检索其
intValue()
,doubleValue()
…,但如果要将它与其他数字进行比较,它将不起作用,因为lazlyparsednumber只等于它自己。既然你的问题提到Map上有
Integer
值,最简单的解决方案是更改dto字段的类型:通过这种方式,gson知道您想要的确切数字类型,并且可以将json数字正确地反序列化为整数。
u7up0aaq2#
“你没有”
HashMap<Integer>
“不管是什么,你都有ArrayList<Number>
,这就是gson必须准备的:而且,你没有
String
你抱怨的就是这些LazilyParsedNumber
是的,虽然它确实将值存储为字符串,但该类确实是一个
Number
. 您不必担心它的私有成员变量。但这只是对现在情况的解释。如果你想让gson给你一份
Integer
s、 你应该写下:请记住,gson只能分析类的声明,它无法猜测以后是否确保所有这些泛型数都是整数。