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

Java 如何阻止Gson在反序列化时将数字转换为字符串?,java,gson,Java,Gson,我正在使用Gson将任意JSON字典(对象)转换为Java映射。字典是任意的,因此它可能同时包含数字和字符串值 下面的源代码将JSON数字解析为浮点指数形式的字符串(!),如“1.23456789E8” 如何教Gson将JSON数字转换为Java数字,而不是转换为Java字符串 // a demo of the unwanted behaviour String json = "{\"int\": 123456789}"; Map map = new Gson().fromJson(json,

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

下面的源代码将JSON数字解析为浮点指数形式的字符串(!),如“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

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

如果您的映射(或某些其他集合)具有泛型类型,如
Map
,则不能直接在
fromJson()
中提及该类型

由于直接在类型中提供Map.class会丢失
类型generic,因此必须进行变通。这将使它发挥作用:-

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

谢谢。不幸的是,输入字典中有混合值。我已经更新了问题。欢迎。混合值是什么意思?
{“int”:123,“string”:“xxx”}
。所以它不适合
Map
。我试过
Map
,但指数已经消失了!这已经是一个胜利了。太棒了,你可以将json转换成特定泛型类型的映射,如果你有混合输入,你可以编写自定义解析器读取输入类型键,然后将值添加到相应的映射中。