繁体   English   中英

使用Gson读取数据时避免从整数进行双重转换

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM