gson将hashmap< integer>转换为对象内部的hashmap< string>

kxeu7u2r  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(671)

我有一个物体里面有一张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);

这是结果(截图),原来是数字,现在是字符串。我需要它们作为数字回来。

因此,寻找一个干净的方法。
我绝对可以迭代它,把每个数字从字符串改回数字,然后替换它。。。但我在想也许还有其他更好的方法。

8iwquhpp

8iwquhpp1#

这些值仍然是 java.lang.Number 在解析json之后。但是,因为您的字段具有 LinkedHashMap<String, ArrayList<Number>> ,gson使用其内部类型 LazilyParsedNumber 因为它不能知道你想要哪种特定的类型 Number 要解析的。lazlyparsednumber充当json字符串表示的 Package 器,因此可以调用相应的 Number 方法来分析值。
如果只检索其 intValue() , doubleValue() …,但如果要将它与其他数字进行比较,它将不起作用,因为lazlyparsednumber只等于它自己。
既然你的问题提到Map上有 Integer 值,最简单的解决方案是更改dto字段的类型:

LinkedHashMap<String, ArrayList<Integer>>

通过这种方式,gson知道您想要的确切数字类型,并且可以将json数字正确地反序列化为整数。

u7up0aaq

u7up0aaq2#

“你没有” HashMap<Integer> “不管是什么,你都有 ArrayList<Number> ,这就是gson必须准备的:

public class MultiSeriesTimebasedChartDTO implements Serializable{
  LinkedHashMap<String, ArrayList<Number>> data;
                        ^^^^^^^^^^^^^^^^^
}

而且,你没有 String 你抱怨的就是这些 LazilyParsedNumber 是的,

虽然它确实将值存储为字符串,但该类确实是一个 Number . 您不必担心它的私有成员变量。

public final class LazilyParsedNumber extends Number { // <= extends Number
  private final String value;  // <= this is what you see in the debugger

但这只是对现在情况的解释。如果你想让gson给你一份 Integer s、 你应该写下:

public class MultiSeriesTimebasedChartDTO implements Serializable{
  LinkedHashMap<String, ArrayList<Integer>> data;
}

请记住,gson只能分析类的声明,它无法猜测以后是否确保所有这些泛型数都是整数。

相关问题