一 坑

场景:将Map<String,Object>结果序列化后放入redis缓存,发现反序列化后Integer类型自动转换成了Double类型

二 测试重现

  1. @Test
  2. public void testJsonDefault() {
  3. Map<String,Object> map=new HashMap<>();
  4. map.put("a","aa");
  5. map.put("b",11);
  6. String json=GsonUtil.toJson(map,false);
  7. map=GsonUtil.fromJsonDefault(json, new TypeToken<Map<String, Object>>() {
  8. });
  9. showMap(map);
  10. }

运行结果:

a-aa-String

b-11.0-Double

三 解决

  1. /**
  2. * json字符串转bean对象
  3. *
  4. * @param json
  5. * @param cls
  6. * @return
  7. */
  8. public static <T> T fromJson(String json, Class<T> cls) {
  9.  
  10. Gson gson = new GsonBuilder().setDateFormat(DATEFORMAT_default)
  11. .create();
  12.  
  13. return gson.fromJson(json, cls);
  14.  
  15. }
  1. public static class MapTypeAdapter extends TypeAdapter<Object> {
  2.  
  3. @Override
  4. public Object read(JsonReader in) throws IOException {
  5. JsonToken token = in.peek();
  6. switch (token) {
  7. case BEGIN_ARRAY:
  8. List<Object> list = new ArrayList<Object>();
  9. in.beginArray();
  10. while (in.hasNext()) {
  11. list.add(read(in));
  12. }
  13. in.endArray();
  14. return list;
  15.  
  16. case BEGIN_OBJECT:
  17. Map<String, Object> map = new LinkedTreeMap<String, Object>();
  18. in.beginObject();
  19. while (in.hasNext()) {
  20. map.put(in.nextName(), read(in));
  21. }
  22. in.endObject();
  23. return map;
  24.  
  25. case STRING:
  26. return in.nextString();
  27.  
  28. case NUMBER:
  29. /**
  30. * 改写数字的处理逻辑,将数字值分为整型与浮点型。
  31. */
  32. double dbNum = in.nextDouble();
  33.  
  34. // 数字超过long的最大值,返回浮点类型
  35. if (dbNum > Long.MAX_VALUE) {
  36. return dbNum;
  37. }
  38.  
  39. // 判断数字是否为整数值
  40. long lngNum = (long) dbNum;
  41. if (dbNum == lngNum) {
  42. return lngNum;
  43. } else {
  44. return dbNum;
  45. }
  46.  
  47. case BOOLEAN:
  48. return in.nextBoolean();
  49.  
  50. case NULL:
  51. in.nextNull();
  52. return null;
  53.  
  54. default:
  55. throw new IllegalStateException();
  56. }
  57. }
  58.  
  59. @Override
  60. public void write(JsonWriter out, Object value) throws IOException {
  61. // 序列化无需实现
  62. }
  63.  
  64. }

继续测试:

  1. @Test
  2. public void testfromJson() {
  3. Map<String,Object> map=new HashMap<>();
  4. map.put("a","aa");
  5. map.put("b",11);
  6. String json=GsonUtil.toJson(map,false);
  7. map = GsonUtil.fromJson(json,
  8. new TypeToken<Map<String, Object>>() {
  9. });
  10. showMap(map);
  11. }

运行结果:

a-aa-String

b-11-Long

Gson反序列化Map,整型自动转换为浮点型的更多相关文章

  1. Python数据格式:%s字符串,%d整型,%f浮点型

    格式化符% name="Tom" age=int(input("age")) pt2="%s你的年龄是%d"%(name,age) prin ...

  2. Python 之 %s字符串、%d整型、%f浮点型

    %s string="hello" #%s打印时结果是hello print "string=%s" % string # output: string=hel ...

  3. Python基础:数值(布尔型、整型、长整型、浮点型、复数)

    一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...

  4. GO语言学习——基本数据类型——整型、浮点型、复数、布尔值、fmt占位符

    基本数据类型 整型 整型分为以下两个大类: 按长度分为:int8.int16.int32.int64 对应的无符号整型:uint8.uint16.uint32.uint64 其中,uint8就是我们熟 ...

  5. java 基础--8 种基本数据类型:整型、浮点型、布尔型、字符型 整型中 byte、short、int、long 的取值范围 什么是浮点型?什么是单精度和双精度?为什么不能用浮点型表示金额?

     一.8种基本数据类型(4整,2浮,1符,1布): 整型:byte(最小的数据类型).short(短整型).int(整型).long(长整型): 浮点型:float(浮点型).double(双精度浮点 ...

  6. Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)

    提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...

  7. Python 将numpy array由浮点型转换为整型

    Python 将numpy array由浮点型转换为整型 ——使用numpy中的astype()方法可以实现,如:

  8. python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串

    磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...

  9. Go语言类型(布尔、整型、数组、切片、map等)

    1.基本类型 布尔类型:bool 注意:布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换. 整型:int8.byte(uint8).int16.int.uint.uintptr int.ui ...

随机推荐

  1. 笔记本电脑没有Pause键,远程桌面无法全屏

    用过mstsc远程桌面的都知道,可以用CTRL+ALT+Break 切换为全屏操作,但有些品牌的电脑不知道设计理念是啥,居然没有Break键,解决办法就是用Fn+B键替换Break键,也就是同时按住C ...

  2. 软件目录结构规范(以python为例)

    为什么要设计好目录结构   "设计项目目录结构",就和"代码编码风格"一样,属于个人风格问题.对于这种风格上的规范,一直都存在两种态度: 一类同学认为,这种个人 ...

  3. 单点登录系统和CAS的简介

    ---恢复内容开始--- 什么是单点登录? 单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以 ...

  4. ElasticSearch(十)Elasticsearch检索出的数据列表按字段匹配的优先顺序及搜索单词拼音一部分搜不到数据

    检索出的数据列表按字段匹配的优先顺序 一.举例 比如,发布一篇文章,文章包括基本的字段包括标题.发布时间.点击率.关键字.内容.当在页面中输入“教育”搜索关键词,会检索出指定字段包括“教育”的所有数据 ...

  5. 【题解】Luogu P2347 砝码称重

    正经·DP题解 一道非常好的背包练手题( sto(注:原思路来源 SLYZ_0120 的题解)orz 开始这道题 1.输入六个数,存进数组中 2.初始化 f 数组为0. f [ i ] 表示重量为 i ...

  6. 依据word模板批量生成试卷

    java-word-MassProduction 目录 使用方法 开发流程 一.使用方法 1.制造题库所需Word模板 需要填充数据的地方使用 ${pid} 代替. 将这个word选择另存为,保存格式 ...

  7. 升级python2.7, 实现python2.7与python3并存

    由于用到twilio模块, 所以需要升级一下python2, 但是又不想舍弃python2, 于是实现了简单的方法 python 先扔一块依赖 yum install zlib-devel bzip2 ...

  8. <抽象工厂>比<工厂方法>多了啥

    前言:仅当复习讨论,写得不好,多多指教! 上一篇文章<比多了啥>介绍了简单工厂模式和工厂方法模式.本篇文章则讲最后一个工厂----抽象工厂.如果对工厂方法比较模糊的,可以返回上一篇文章复习 ...

  9. HDU 3567 Eight II(八数码 II)

    HDU 3567 Eight II(八数码 II) /65536 K (Java/Others)   Problem Description - 题目描述 Eight-puzzle, which is ...

  10. memcached、cookie、session

    Memcached(一个高性能的分布式的内存对象缓存系统) 可用来分担数据库的压力.通过在内存里维护一个统一的巨大的hash表,memcached能存储各种各样的数据,包括图像.视频.文件.以及数据库 ...