Java Gson转换HashMap<;整数>;到HashMap<;字符串>;在我的物体里面
我有一个物体,里面有一张地图:Java Gson转换HashMap<;整数>;到HashMap<;字符串>;在我的物体里面,java,json,gson,Java,Json,Gson,我有一个物体,里面有一张地图: MyDTO HashMap<Integer> 我如何强制它转换/保持DTO中的映射为Map,而不是Map 这是我的目标: public类multiseriestimebasedchardt实现可序列化 { LinkedHashMap数据; } 下面是我如何将JSON转换回object的: multiseriestimebasedchardto=gson.fromJson(json,multiseriestimebasedchardto
MyDTO
HashMap<Integer>
我如何强制它转换/保持DTO中的映射为Map
,而不是Map
这是我的目标:
public类multiseriestimebasedchardt实现可序列化
{
LinkedHashMap数据;
}
下面是我如何将JSON转换回object的:
multiseriestimebasedchardto=gson.fromJson(json,multiseriestimebasedchardto.class);
这是结果(在屏幕截图中),原来是数字,现在是字符串。我需要它们作为数字返回
因此,我们正在寻找一种干净的方法来解决这个问题
我肯定可以迭代它,将每个数字从字符串改回数字,然后替换它。。。但是我在想可能还有其他更好的方法。解析JSON后,值仍然是
java.lang.Number
s。但是,由于您的字段具有类型LinkedHashMap
,因此Gson使用其内部类型,因为它无法知道您希望解析的编号
是哪种特定类型。LazlyParsedNumber充当JSON字符串表示的包装器,因此您可以调用相应的Number
方法来解析值
如果只检索其intValue()
,doubleValue()
…,则LazlyParsedNumber应该足够了,但如果要将其与其他数字进行比较,则它将不起作用,因为LazlyParsedNumber仅等于自身
由于您的问题提到映射包含Integer
值,因此最简单的解决方案是更改DTO字段的类型:
LinkedHashMap<String, ArrayList<Integer>>
LinkedHashMap
通过这种方式,Gson知道您想要的确切数字类型,并且可以正确地将JSON数字反序列化为整数。您没有“HashMap
”无论是什么,您都有ArrayList
,这就是Gson必须准备的:
但这只是对现在情况的解释。如果您希望GSON为您生成一个Integer
s列表,您只需编写以下内容:
public class MultiSeriesTimebasedChartDTO implements Serializable{
LinkedHashMap<String, ArrayList<Integer>> data;
}
public类multiseriestimebasedchardt实现可序列化{
LinkedHashMap数据;
}
请记住,GSON只能分析类的声明,它无法猜测您以后是否确保所有这些泛型数字都是整数。作为映射而不是作为映射,因为在我从json转换回我的对象后,我的对象中的映射类型为整数,它没有转换为类型字符串,因此,我的映射中的所有内容现在都是字符串,它们实际上是整数,说明DTO和源JSON
map
不是有效的Java类型,因为map
需要两个类型参数。你的意思是Map
还是Map
?通常,Map
转换为JSON对象,由于JSON对象是一组名称/值对,Map
中的键转换为字符串,因为JSON属性名称必须是字符串。这就是你所指的吗?我在问题中添加了详细信息。你能显示你的map.put()行吗?或者您的数据=行中的任何内容?
public final class LazilyParsedNumber extends Number { // <= extends Number
private final String value; // <= this is what you see in the debugger
public class MultiSeriesTimebasedChartDTO implements Serializable{
LinkedHashMap<String, ArrayList<Integer>> data;
}