Gson将json转Map的那些坑

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

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

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

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

 @Test
    public void testBug() { 	String json2 = "{0=\"外观\",1=\"大厅\"}";
        Map 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了。

 @Test
    public void testBug() {        String json2 = "{0=\"外观\",1=\"大厅\"}";
        System.out.println("===通过reflect告知Gson Map键值对的类型===");
        java.lang.reflect.Type type = new TypeToken>() {
        }.getType();
        Map 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是类型的,为何最后赋值给Map没有任何编译错误呢?当我们直接写如下代码时会有编译错误,这个问题就有待考究了。

    更正(2018-03-03)

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

        Map m=new HashMap<>();
        m.put("w", "s");
        Map map = m;
        路过的大神如有了解,请告知原因,不慎感激。


欢迎个人转载,但须在文章页面明显位置给出原文连接;
未经作者同意必须保留此段声明、不得随意修改原文、不得用于商业用途,否则保留追究法律责任的权利。

【 CSDN 】:csdn.zxiaofan.com
【GitHub】:github.zxiaofan.com

如有任何问题,欢迎留言。祝君好运!
Life is all about choices! 
将来的你一定会感激现在拼命的自己!



你可能感兴趣的:(gson,json,map,Integer,Java)