如何阻止Gson在反序列化时将数字转换为字符串?

时间:2015-01-13 06:06:42

标签: java gson

我正在使用Gson将任意JSON字典(对象)转换为Java映射。字典是任意的,因此它可能包含数字和字符串值。

下面的源代码导致JSON编号以float exponental形式(!!)解析为字符串(!),如“1.23456789E8”。

如何教Gson将JSON数转换为Java数,而不是转换为Java字符串?

// a demo of the unwanted behaviour
String json = "{\"int\": 123456789}";
Map map = new Gson().fromJson(json, Map.class);
assert map.get("int").equals("1.23456789E8");

Java 1.6,Gson 2.2.4

1 个答案:

答案 0 :(得分:1)

引自Gson Documentation

  

当你调用toJson(obj)时,Gson调用obj.getClass()来获取有关要序列化的字段的信息。类似地,您通常可以在fromJson(json,MyClass.class)方法中传递MyClass.class对象。如果对象是非泛型类型,则此方法正常。但是,如果对象是泛型类型,则由于Java类型擦除而导致泛型类型信息丢失

如果您的地图(或其他一些集合)具有通用类型,例如Map<String,Integer>,则您无法直接将该类型提及到fromJson()

您必须执行一种解决方法,因为直接在类型中提供Map.class会丢失<String,Integer>类型泛型。这将使它工作: -

java.lang.reflect.Type t = new TypeToken<Map<String,Integer>>() {}.getType();
Map<String,Integer> map1= (Map<String,Integer>) new Gson().fromJson(json, t);