利用Gson将一串json数据转为Map格式,再get数据,相比很多人都做过。今天遇到一个“坑”,mark一下。

首先明确一点:Gson是可以将json转为Map的,并且Map的key是允许为Integer的。

    public void test() {
<span style="white-space:pre"> </span>String json1 = "{\"k1\"=\"外观\",\"k2\"=\"大厅\"}";Map<String, String> map = gson.fromJson(json1, HashMap.class);System.out.println(map.get("k1")); // 输出“外观”Map<Integer, String> map2 = new HashMap<>();map2.put(1, "value");System.out.println(map2.get(1)); // 输出“value”}

接下来,看看这个“坑”。

 @Testpublic void testBug() { <span style="white-space:pre">   </span>String json2 = "{0=\"外观\",1=\"大厅\"}";Map<Integer, String> map = gson.fromJson(json2, HashMap.class);System.out.println(map.get(new Integer("1"))); // 输出 null}

我们发现,当我们查找key为1的value时,返回值为null。但是调试分析可发现HashMap中确实是有key=1这个键值对的。这是为什么呢?百思不得解,随后,当我在testBug中这样查值,却能正常返回数据。

System.out.println(map.get("1")); // 输出 "大厅"

这就显得很尴尬了,明明为Map指定了Integer类型,却变成了String类型,难道Gson默认这样不厚道的转换了一下,诚然,我最初的确这么想的,但随后就否决了,google不至于这么菜吧。

细细一想,其实我们根本就没告诉Gson我们HashMap中key的类型,最后仅仅是将Gson转换成功的Map赋值给我们声明的Map,So如下转换就OK了。

 @Testpublic void testBug() {        String json2 = "{0=\"外观\",1=\"大厅\"}";System.out.println("===通过reflect告知Gson Map键值对的类型===");java.lang.reflect.Type type = new TypeToken<HashMap<Integer, String>>() {}.getType();Map<Integer, String> map2 = gson.fromJson(json2, type);System.out.println(map2.get(new Integer("1"))); // 输出 "大厅"System.out.println(map2.get("1")); // 输出 null// reflect确定类型后转换一切正常}

相关测试代码详见: https://github.com/zxiaofan/JDK-Study/blob/master/src/java1/util/map/GsonToMap.java

但另外一个问题又来了,既然Gson转换后的Map是<String,String>类型的,为何最后赋值给Map<Integer,String>没有任何编译错误呢?当我们直接写如下代码时会有编译错误,这个问题就有待考究了。

更正(2018-03-03)

但另外一个问题又来了,当没有指定类型的时候,int、double都会默认转成String,因为gson无法确定真实类型,指定类型后就会转换成实际类型了。当我们直接写如下代码时会有编译错误,是由于类型推断出实际类型应该是<String, String>,直接赋值给<Integer,String>当然编译会有问题。

        Map<String, String> m=new HashMap<>();m.put("w", "s");Map<Integer, String> map = m;

路过的大神如有了解,请告知原因,不慎感激。

欢迎个人转载,但须在文章页面明显位置给出原文连接;
未经作者同意必须保留此段声明、不得随意修改原文、不得用于商业用途,否则保留追究法律责任的权利。【 CSDN 】:csdn.zxiaofan.com
【GitHub】:github.zxiaofan.com如有任何问题,欢迎留言。祝君好运!
Life is all about choices!
将来的你一定会感激现在拼命的自己!

Gson将json转Map的那些坑相关推荐

  1. 使用Gson解析Json为Map对象探索(下)

    使用Gson解析Json为Map对象探索(下) 下面来说说其中出现的问题 1.如何获取一个list列表 1.1首先是数据格式 1.2处理成列表的代码 com.google.gson.Gson gson ...

  2. 使用Gson解析Json为Map对象探索(上)

    使用Gson解析Json为Map对象探索(上) 有些时候由于后台业务系统的不一样导致一个Json的list对象装的并非是同一种类型的对象,导致无法建立比较好的Java模型,而刚好可以利用map对象的通 ...

  3. Gson将json转Map 浮点型数据精度丢失问题

    今天是1024节,写篇博客纪念下(其实就是想点亮1024勋章,哈哈哈),想到前段时间做flink的数据采集遇到的json转换数值精度问题导致消费端数据转换异常 逻辑很简单,就是要将一段json格式的报 ...

  4. Gson应用:利用map和list来拼装Json消息

    Gson应用:利用map和list来拼装Json消息 1 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import ja ...

  5. Json转换利器Gson之实例四-Map处理(下)

    Map的存储结构式Key/Value形式,Key 和 Value可以是普通类型,也可以是自己写的JavaBean(上一篇博客),还可以是带有泛型的List(本文).本例中您要重点看如何将Json转回为 ...

  6. Java JSON转Map fastjson、gson、jackson、效率测试对比

    测试Java中json字符串转map的效率, 1,使用的json字符串: 40个键值对:50个键值对 = 1:1 = 66986 x 2 = 133972个json, 每个json的key字符串长度= ...

  7. gson解析json maven_Gson解析Json

    Json(JavaScript Object Notation)是一种轻量级的数据交换格式,类似XML,但比XML更小更快更容易解析.当前各种流行的web应用框架都对Json提供良好的支持,各种流行开 ...

  8. java中gso是什么意思_Java中用Gson解析json字符串

    本文最后更新于2019年9月13日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! =Start= 缘由: 因为阿里开源的fastjson前段时间爆出的漏洞实在是太多了(而且有些漏洞他 ...

  9. Gson将字符串转map时,int默认为double类型

      gson能够将json字符串转换成map, 但是在转成map时, 会默认将字符串中的int , long型的数字, 转换成double类型 , 数字会多一个小数点 , 如 1 会转成 1.0 Gs ...

  10. 通过输入流获取的xml格式字符串转为json和map格式

    通过输入流获取的xml格式字符串转为json和map格式 xml格式字符串转json格式代码: try {//通过输入流获取xml格式字符串数据ServletInputStream inputStre ...

最新文章

  1. 《编译与反编译技术实战 》一2.3 编译器的设计与实现概述
  2. [ERROR] ubuntu18.04 install ceres
  3. 【NLP傻瓜式教程】手把手带你HAN文本分类(附代码)
  4. wget安装Jenkins
  5. Android子线程真的不能更新UI么
  6. centos7加入第二块网卡无法识别
  7. oracle 11g 配置navicate lite Instance Client下载
  8. 2.支付平台架构:业务、规划、设计与实现 --- 收银台系统
  9. 《Unity3D脚本编程与游戏开发》学习Day one
  10. 指数基金投资从入门到精通——阅读笔记
  11. 2022最新Postman安装以及基本操作使用教程
  12. 读取npy格式的文件
  13. 简单网页制作html语言,用HTML语言制作简单的网页.doc
  14. Erlang学习时间曲线
  15. 电脑上的PDF文件太大了怎么办?
  16. 手机APP从服务器获取列表和详情
  17. 元宇宙虚拟人物风格形象应用场景制作
  18. 《如何阅读一本书》—[美]莫提默.J.艾德勒、查尔斯.范多伦
  19. (python)生产者消费者模型
  20. html中添加水印效果

热门文章

  1. JZOJ7月18日提高组T3 Ocd
  2. 服务器系统建立安全连接失败,尝试与系统“ServerName”建立安全连接时,MSDTC遇到错误(HR = 0x80000171)...
  3. 【檀越剑指大厂--jvm】jvm总结
  4. SUN Solaris 问题小结
  5. python实现猜数字游戏
  6. java计算机毕业设计服装批发进销存系统MyBatis+系统+LW文档+源码+调试部署
  7. 如何实现流水号二维码批量生成
  8. 软件开发团队中各个成员的英文简称
  9. 潮流计算和最优潮流计算
  10. Js分割字符串 - split