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;
}