如何在反序列化时停止 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, Map.class);
assert map.get("int").equals("1.23456789E8");

Java 1.6, Gson 2.2.4

引用自 Gson 文档

当你调用 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);

最新更新