[英]How to extract only the integer value instead of the Double value when reading data from Excel using Java
[英]Avoid double conversion from integer while reading data using Gson
我正在使用Aerospike中的json保存数据:
new Gson().toJson(data)
在阅读时,我正在使用typetoken:
Type type = new TypeToken<Map<String, Object>>() {
}.getType();
Map<String, Map<String, Object>> myMap = new Gson().fromJson(dataFromCache, type);
上述转换的问题是,所有整数都转换为双精度。 如何停止转换?
这是Gson中的一个众所周知的问题。 默认情况下,Gson总是将声明为Object
JSON数字反序列化为Double
导致长整数值失去一些精度。 Object
序列化器/反序列化器不能被设计覆盖,因此您不能更改其行为。 如果您可以将声明类型的范围缩小为Number
,那么Gson会将数字反序列化为com.google.gson.internal.LazilyParsedNumber
,该数字包含支持字符串,并且可以将其延迟解析为任何“内置”数字类型(例如longValue()
和doubleValue()
可以返回适当的值)。 如果您可以缩小更多范围,则效果会更好。 例:
final String json = "[1,4,9]";
final Iterable<? extends Type> types = ImmutableList.of(
new TypeToken<Collection<Object>>() {}.getType(),
new TypeToken<Collection<Number>>() {}.getType(),
new TypeToken<Collection<Integer>>() {}.getType()
);
for ( final Type type : types ) {
System.out.print(type);
System.out.print(": ");
System.out.println();
for ( final Object value : gson.<Iterable<?>>fromJson(json, type) ) {
System.out.print('\t');
System.out.print(value);
System.out.print(' ');
System.out.println(value.getClass());
}
}
将产生以下输出:
java.util.Collection<java.lang.Object>:
1.0 class java.lang.Double
4.0 class java.lang.Double
9.0 class java.lang.Double
java.util.Collection<java.lang.Number>:
1 class com.google.gson.internal.LazilyParsedNumber
4 class com.google.gson.internal.LazilyParsedNumber
9 class com.google.gson.internal.LazilyParsedNumber
java.util.Collection<java.lang.Integer>:
1 class java.lang.Integer
4 class java.lang.Integer
9 class java.lang.Integer
简而言之,至少从Gson 2.8.4起,您不能对Object
进行此操作,但是可以根据需要指定一个更具体的类型。 我正在尝试解决此问题,但修复程序仍处于预审核状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.