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

 更新时间:2017年03月05日 11:19:21   投稿:jingxian  
下面小编就为大家带来一篇完美解决gson将Integer默认转换成Double的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

首先javascript只有这些个类型:

1、Number 在JavaScript中的双精度浮点格式

2、String 双引号的反斜杠转义的Unicode

3、Boolean true 或 false

4、Array 值的有序序列

5、Value 它可以是一个字符串,一个数字,真的还是假(true/false),空(null )等

6、Object 无序集合键值对

7、Whitespace 可以使用任何一对中的令牌

8、null empty

所以可以得出结论其实在javascript中20和20.0其实是相等的,都是number类型,即javascript中没有整数类型一说。

因此我们用gson.fromJson(msg, new TypeToken<Map<String, Object>>() {}.getType())将json字符串msg

例如:

{"id":20,"name":"test"}转换成Map<String,Object>时,就会把数字类型的值都转换成了Double类型(此时map中key为“id”的值是一个Double类型,为20.0)

当我们再把这个Map用gson.toJson转换成json字符串时,奇葩的事情就发生了,不再和我们最开始传进来的json字符串一致了,变成了{"id":20.0,"name":"test"}

想让它们一致,可以这样创建gson对象:

<span style="font-family:arial, 宋体, sans-serif, tahoma, Microsoft YaHei;color:#454545;">   Gson gson = new GsonBuilder().
        registerTypeAdapter(Double.class, new JsonSerializer<Double>() {

          @Override
          public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
            if (src == src.longValue())
              return new JsonPrimitive(src.longValue());
            return new JsonPrimitive(src);
          }
        }).create();</span>

即如果是Double类型的,判断一下它和它的longValue是否相等,如果相等则说明小数位是补了一个".0",那么我们就返回src.longValue,否则直接返回Double src。

以上这篇完美解决gson将Integer默认转换成Double的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java 中同步方法和同步代码块的区别详解

    java 中同步方法和同步代码块的区别详解

    这篇文章主要介绍了java 中同步方法和同步代码块的区别是什么的相关资料,需要的朋友可以参考下
    2017-02-02
  • springboot配置Hikari连接池方式

    springboot配置Hikari连接池方式

    本文介绍了在Springboot中配置Hikari连接池的具体参数和设置,涵盖了autoCommit, connectionTimeout, idleTimeout, maxLifetime, minimumIdle, maximumPoolSize等关键配置项,并提供了它们的默认值、描述和条件下的重置规则
    2024-09-09
  • mybatis条件构造器(EntityWrapper)的使用方式

    mybatis条件构造器(EntityWrapper)的使用方式

    这篇文章主要介绍了mybatis条件构造器(EntityWrapper)的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • MyBatis-Plus多表联查(动态查询)的项目实践

    MyBatis-Plus多表联查(动态查询)的项目实践

    本文主要介绍了MyBatis-Plus多表联查(动态查询)的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 深入探究Java编程是值传递还是引用传递

    深入探究Java编程是值传递还是引用传递

    大家好,本篇文章主要讲的是Java编程是值传递还是引用传递的探究,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-04-04
  • java关键字abstract(抽象)实例详解

    java关键字abstract(抽象)实例详解

    在Java中,抽象类是不能实例化的类,它通常作为其他子类的父类存在,并提供了一种继承的框架,抽象类中可以包含抽象方法,这些方法没有具体的实现,必须由子类来提供,本文给大家介绍java关键字abstract(抽象)实例详解,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • MyEclipse打开文件跳转到notepad打开问题及解决方案

    MyEclipse打开文件跳转到notepad打开问题及解决方案

    windows系统打开README.md文件,每次都需要右键选择notepad打开,感觉很麻烦,然后就把README.md文件打开方式默认选择了notepad,这样每次双击就能打开,感觉很方便,这篇文章主要介绍了MyEclipse打开文件跳转到notepad打开问题,需要的朋友可以参考下
    2024-03-03
  • ShardingSphere解析SQL示例详解

    ShardingSphere解析SQL示例详解

    这篇文章主要为大家介绍了ShardingSphere解析SQL的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java结构型设计模式之适配器模式详解

    Java结构型设计模式之适配器模式详解

    适配器模式,即将某个类的接口转换成客户端期望的另一个接口的表示,主要目的是实现兼容性,让原本因为接口不匹配,没办法一起工作的两个类,可以协同工作。本文将通过示例详细介绍适配器模式,需要的可以参考一下
    2022-09-09
  • Java中使用ConcurrentHashMap实现线程安全的Map

    Java中使用ConcurrentHashMap实现线程安全的Map

    在Java中,ConcurrentHashMap是一种线程安全的哈希表,可用于实现多线程环境下的Map操作。它支持高并发的读写操作,通过分段锁的方式实现线程安全,同时提供了一些高级功能,比如迭代器弱一致性和批量操作等。ConcurrentHashMap在高并发场景中具有重要的应用价值
    2023-04-04

最新评论