我正在使用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
答案 0 :(得分:1)
当你调用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);