Gson int类型被转换成double问题解决

Gson将json字符串转map导致int型被转换成double的采坑之旅 前言:日常开发中,与json打交道的机会很多,一般对象json转都不会出现什么问题,但是json转对象就有可能出现问题了,今天就来说说json转map导致int型转换成double的问题 问题重现 之前解决过long型被转化成科学计数法的问题,所有就拿以前的公用方法,一个泛型工具类 public class MyType<T> { public T gsonToMap(... 阅读详情

Gson int类型被转换成double问题解决

一、问题复现

1.1、方法封装
    /**
     * 获取list
     *
     * @param json 数据源
     * @param type TypeToken.getParameterized(List.class, xxx.class).getType();
     */
    public static List<?> fromJson(String json, Type type) {
        GsonBuilder gsonBuilder = new GsonBuilder();
        Gson gson = gsonBuilder.create();
        return gson.fromJson(json, type);
    }
1.2、数据演示
    public static void main(String[] args) {
        String data = "[{\"id\":37,\"parentId\":0,\"name\":\"首页\",\"data\":{\"menuUrl\":\"/\",\"menuCode\":\"0001\"},\"children\":[],\"leaf\":true},{\"id\":38,\"parentId\":0,\"name\":\"书籍\",\"data\":{\"menuUrl\":\"/grid.html\",\"menuCode\":\"0002\"},\"children\":[],\"leaf\":true},{\"id\":39,\"parentId\":0,\"name\":\"博客\",\"data\":{\"menuUrl\":\"/list.html\",\"menuCode\":\"0004\"},\"children\":[],\"leaf\":true},{\"id\":40,\"parentId\":0,\"name\":\"项目\",\"data\":{\"menuUrl\":\"/project.html\",\"menuCode\":\"0005\"},\"children\":[],\"leaf\":true},{\"id\":41,\"parentId\":0,\"name\":\"工具\",\"data\":{\"menuUrl\":\"/tools.html\",\"menuCode\":\"0006\"},\"children\":[],\"leaf\":true}]";
        List<?> tree = fromJson(data, TypeToken.getParameterized(List.class, Tree.class).getType());
        System.out.println(toJson(tree));
    }
1.3、解析结果
[{"id":37.0,"parentId":0.0,"name":"首页","data":{"menuUrl":"/","menuCode":"0001"},"children":[],"leaf":true},{"id":38.0,"parentId":0.0,"name":"书籍","data":{"menuUrl":"/grid.html","menuCode":"0002"},"children":[],"leaf":true},{"id":39.0,"parentId":0.0,"name":"博客","data":{"menuUrl":"/list.html","menuCode":"0004"},"children":[],"leaf":true},{"id":40.0,"parentId":0.0,"name":"项目","data":{"menuUrl":"/project.html","menuCode":"0005"},"children":[],"leaf":true},{"id":41.0,"parentId":0.0,"name":"工具","data":{"menuUrl":"/tools.html","menuCode":"0006"},"children":[],"leaf":true}]
1.4、问题

int类型的id被转换成了double类型。

二、解决方案

2.1、旧的(网上千篇一律的复制方案)

新建TypeAdapter接口的子类,自行转换。网上疯传的就是创建:DataTypeAdapter,代码不再贴出。

2.2、Gson修改方案
2.2.1、分析

其实通过分析GsonBuilder的构造方法源码:

   public GsonBuilder() {
		...略...
        this.objectToNumberStrategy = ToNumberPolicy.DOUBLE;
        this.numberToNumberStrategy = ToNumberPolicy.LAZILY_PARSED_NUMBER;
    }

我们可以发现,在构造的时候默认了Object和Number类转换成数字类型的处理策略,可以看到,Object转换默认为ToNumberPolicy.DOUBLE的dobule的类型,因此不单单是int会被转换成double,Long类型等等数值类型都会默认被转换成dobule类型。

2.2.2、策略类
public enum ToNumberPolicy implements ToNumberStrategy {
    DOUBLE {
        ...略...
    },
    LAZILY_PARSED_NUMBER {
        public Number readNumber(JsonReader in) throws IOException {
            return new LazilyParsedNumber(in.nextString());
        }
    },
    LONG_OR_DOUBLE {
        ...略...
    },
    BIG_DECIMAL {
        ...略...
    };

    private ToNumberPolicy() {
    }
}

通过上面的策略类源码,我们发现:LAZILY_PARSED_NUMBER就是处理数值类型的枚举,查看LazilyParsedNumber源码,我们发现确实进行了细致的数值类型处理划分:

public final class LazilyParsedNumber extends Number {
    private final String value;

    public LazilyParsedNumber(String value) {
        this.value = value;
    }

    public int intValue() {
        try {
            return Integer.parseInt(this.value);
        } catch (NumberFormatException var4) {
            try {
                return (int)Long.parseLong(this.value);
            } catch (NumberFormatException var3) {
                return (new BigDecimal(this.value)).intValue();
            }
        }
    }

    public long longValue() {
         ...略...
    }

    public float floatValue() {
         ...略...
    }

    public double doubleValue() {
         ...略...
    }

    public String toString() {
        return this.value;
    }

    private Object writeReplace() throws ObjectStreamException {
        return new BigDecimal(this.value);
    }
     ...略...
}
2.2.2、解决

既然知道构造的时候设置了默认,所以修复就很简单了,我们调用设置转换的策略方法即可:

    /**
     * 获取list
     *
     * @param json 数据源
     * @param type TypeToken.getParameterized(List.class, xxx.class).getType();
     */
    public static List<?> fromJson(String json, Type type) {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setObjectToNumberStrategy(ToNumberPolicy.LAZILY_PARSED_NUMBER);
        Gson gson = gsonBuilder.create();
        return gson.fromJson(json, type);
    }

测试结果:

[{"id":{"value":"37"},"parentId":{"value":"0"},"name":"首页","data":{"menuUrl":"/","menuCode":"0001"},"children":[],"leaf":true},{"id":{"value":"38"},"parentId":{"value":"0"},"name":"书籍","data":{"menuUrl":"/grid.html","menuCode":"0002"},"children":[],"leaf":true},{"id":{"value":"39"},"parentId":{"value":"0"},"name":"博客","data":{"menuUrl":"/list.html","menuCode":"0004"},"children":[],"leaf":true},{"id":{"value":"40"},"parentId":{"value":"0"},"name":"项目","data":{"menuUrl":"/project.html","menuCode":"0005"},"children":[],"leaf":true},{"id":{"value":"41"},"parentId":{"value":"0"},"name":"工具","data":{"menuUrl":"/tools.html","menuCode":"0006"},"children":[],"leaf":true}]

三、技术支持

1、Litepal智能开发管理系统
2、提供各种管理系统、APP开发、小程序开发、网站开发
3、提供Java程序开发,Android与IOS以及uniapp开发与技术支持
4、微信:qq690898091,QQ:690898091

解决Gson转Map时数值int、long等转为Double Gson默认采取将数值转换到Double的策略,在2.8.9版本后,可以在GsonBuilder创建时通过setObjectToNumberStrategy方法自定义数值转换策略 阅读详情

相关推荐

完美解决gson将Integer默认转换成Double的问题

下面小编就为大家带来一篇完美解决gson将Integer默认转换成Double的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Gson int类型被转换成double问题解决(完美解决)

Gson int类型被转换成double问题解决(完美解决)

TomLeisen的博客 7217

六轴机器人正解

采用的是John H.Craig在【机器人学导论】中的改进DH模型 1.六轴坐标系 2.DH参数 i αi−1\alpha_{i-1}αi−1​ ai−1a_{i-1}ai−1​ did_idi​ θi\theta_iθi​初值 1 0 0 0 0 2 -90 a1a_1a1​ 0 -90 3 0 a2a_2a2​ 0 -90 4 -90 a3a_3a3​ d4d...

m0_37581770的博客 2511

解决 Gson int自动转double问题

本文是要解决使用Gson,后端返回的int或者long类型,会自动转为double。具体原理就不多说了,网上有很多,有兴趣的小伙伴可以去看 TypeAdapter 和 ObjectTypeAdapter。

weixin_43820591的博客 1583

轻量级NAS的隐秘战场:比特米盒CumeBox2与CasaOS的生态融合实践

本文探讨了比特米盒CumeBox2轻量级NAS设备与CasaOS操作系统的生态融合实践。通过硬件选型、系统部署、性能优化和应用场景分析,展示了如何将CumeBox2与CasaOS深度整合,打造经济实用的家庭数据管理中心,特别适合入门级用户和小型办公环境。

rl6adventurer的博客 895

积木报表导出数据量太大报错

‌性能问题‌:‌当数据量非常大时,‌积木报表在导出过程中可能会遇到性能瓶颈,‌导致导出过程缓慢甚至失败。‌解决这一问题的方法包括优化SQL查询、‌调整分页大小、‌使用更适合处理大量数据的库(‌如阿里巴巴的EasyExcel)‌进行导出,‌或者采用异步处理的方式来避免接口超时1。‌内存溢出‌:‌如果报表工具或其依赖的库不支持流式(‌分批)‌导出,‌大量数据的处理可能会导致内存溢出。‌数据处理方式‌:‌如果待导出的数据包含特殊字符,‌如英文双引号或等号,‌这可能导致JSON反序列化报错。

Activiti工作流 1906

gson 解析int类型转换为double解决方案

Gson解析Int类型转换为double类型解决方案

yojofly的博客 3064

stm32使用TB6600驱动器控制42BYGH型步进电机

stm32使用TB6600驱动器控制42BYGH型步进电机

qq_35653974的博客 9585

彻底解决 Gson 将 int 转换为 double 的问题

1、现状及原因 目前网络上的资料中有两种解决这个问题的办法。 第一种:修改源码。 第二种:添加指定类型的自定义解密工具。 所有能找到的资料中,都对第一种进行了忽略,认为修改源码改动太大,转而使用了第二种方式。 不论是注册Map的解析器,还是使用自定义的Bean对象,本质都是指定类型解析,也就是第二种,完全无法解决以下问题。 gson.fromJson(s,new TypeToken<List&lt...

s_156的博客 3971

【ChangeCLIP】Remote sensing change detection with multimodal vision-language representation learning

ChangeCLIP论文及代码使用详解。持续更新变化检测最新论文,欢迎订阅本专栏。

向上生长的程序媛的博客 1335

反应堆设计:基于MATLAB的反应堆仿真和分析,包括反应堆稳态分析、反应堆动态分析和反应堆安全分析 介绍

反应堆设计是利用计算机技术对核反应堆进行设计和模拟,以获得安全、高效、经济的核能发电系统。它是核能领域的重要组成部分,在电力生产、核医学、科学研究等领域有着广泛的应用。

走向CTO的路上... 1112

Gson转换导致int转为double问题解决

当我们用Object或者Map中的泛型使用了Object,我们将json转换之后,发现数据中的所以数值都变成了double类型,0变为了0.0,导致后续程序可能出现一些问题。 查看Gson的源码, 会发现Object最后默认的TypeAdapter使用的是com.google.gson.internal.bind包下的ObjectTypeAdapter,里边的处理如下: /** * Adapts...

lebulangzhen的博客 2905

动网格-网格重构之铺层(三)

运动区域可以是边界区域 (Boundary Zone),也可以是单元区域 ( Cell Zone)。指定了体网格再生方法后,FLUENT自动地根据运动区域(dynamic zones)的运动来调整内部节点以再生体网格。必须保留至少一层网格。(4)如果边面的法向和运动方向偏角较大,生成的网格扭斜度会比较大铺层算法不适用于边界形状变化较大的情况。(1)体网格再生方法的选择(Smoothing,Layering,Remeshing);(2)适用网格种类:四边形、六面体、三棱柱(网格的分布要服从一定的规则)。

weixin_44386973的博客 2094

Gson格式转换Integer变为Double类型问题解决

转自:https://my.oschina.net/MIKEWOO/blog/2994643 场景: 转实体对象自定义日期格式:Gson gson = new Gson();或Gson gson = new GsonBuilder().setDateFormat(“yyyy-MM-dd HH:mm:ss”).create(); 第一步:通过gson.toJson()方法先转为json串; (这步...

sunny_Harper的博客 5494

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 266

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Gson 字符串转int类型变double类型解决方案

核心是这个类MapTypeAdapter。 好像是如果字段的类型定义为Object ,就会出现 int类型变double类型 public class GsonUtil { /** * 实现格式化的时间字符串转时间对象 */ private static final String DATEFORMAT_default = "yyyy-MM-dd HH:...

T的专栏 2805

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

解决Gson2.0默认Int转Double问题

Gson默认Int会转成Double,但是提供了hook覆写转换方法。具体如下: /** * 解决gson默认将int转换为double * * @return */ public static Gson getIntGson() { Gson gson = new GsonBuilder().

njubluebird2的专栏 5094

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

GSON转换错误导致Int变为Double类型

GSON在处理JSON字符串的时候,会将JSON字符串里面的 int 类型的数字转换为 double 类型,解决办法:   String str = "JSON字符串"; HashMap&lt;STRING,Object&gt; param = NEW Gson().fromJson(str,NEW TypeToken&lt;HashMap&lt;STRING,STRING&gt;&gt;(...

samile的专栏 2511

解决gson将Integer默认转换成Double的问题

首先javascript只有这些个类型: 1、Number 在JavaScript中的双精度浮点格式  2、String 双引号的反斜杠转义的Unicode  3、Boolean true 或 false  4、Array 值的有序序列  5、Value 它可以是一个字符串,一个数字,真的还是假(true/false),空(null )等  6、Object 无序集合键值对  7、W

xiao_jun_0820的专栏 2万+

gson 默认把int 转double解决办法

class MyMapTypeAdapterFactory() : TypeAdapterFactory { override fun &lt;T : Any?&gt; create(gson: Gson, typeToken: TypeToken&lt;T&gt;): TypeAdapter&lt;T&gt;? { val type = typeToken.getType...

Iamshen01的博客 2065

Gson转Map结果int类型变为Double

用gson将string反序列化为Map时,int类型变成了double类型。 原因分析 new Gson().fromJson("{\"aid\":123,\"aa\":11.0}", Map.class); // 结果为{"aid":123.0,"aa":11.0} 通过看gson解析过程,gson通过TypeAdapter的read方法来读取string的值并转化为对象: public <T> T fromJson(JsonReader reader, Type typeOfT) t

令重生的博客 3120

Gson反序列化 int类型变double类型

Gson反序列化 int类型变double类型 经网上资料查找,序列化的逻辑在 com.google.gson.internal.bind.ObjectTypeAdapter 类中。 将源码拷贝出来,修改 Number 处理逻辑。 @Override public Object read(JsonReader in) throws IOException { JsonToken token = in.peek(); switch (token) { case BEGIN_ARR

我是李白啦~ 816

Gson转换导致int转换成double的问题解决

使用情景:后端返回的json字符串,通过gson处理后,原本是int类型,现在获取到的是double类型的。 解决办法: Map&lt;String,Object&gt; map = new Map&lt;String,Object&gt;; Gson gson = new Gson(); Map&lt;String,Object&gt; dataMap = gson.fromJson(js...

Long的博客 8565
上一篇: Windows 服务器HTTPS免费证书
Litepal
博客等级 码龄12年 17粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值