Gson-Map

Map为什么要单独写?
因为Map有一些奇怪的表现
Map<String,Object>序列化
Map<Object,String>序列化
的结果是不一样,我们先看第一个

    static Gson sGson;

    static Gson getGson() {
        if (sGson == null) {
            sGson = getGsonBuilder().create();
        }
        return sGson;
    }
   private static GsonBuilder getGsonBuilder() {
        return new GsonBuilder();
    }
        public static void main(String[] args) {
        testMap();
    }
    
    private static void testMap(){
        Map<String,Empolyee> map = new HashMap<>();
        for (int i =0;i<3;i++) {
            map.put(""+i, new Empolyee("longxia", i, 10d + i));
        }
        String result = getGson().toJson(map);
        System.out.println(result);
        result = getGson().toJson(map,map.getClass());
        System.out.println(result);
        result = getGson().toJson(map,new TypeToken<Map<String,Empolyee>>(){}.getType());
        System.out.println(result);
    }

输出结果为:

{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}

生成的并不是一个数组,而是一个JSON串。
那我们试下加上enableComplexMapKeySerialization() 方法后

    private static GsonBuilder getGsonBuilder() {
        return new GsonBuilder().enableComplexMapKeySerialization();
    }

输出结果


{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}

发现加不加enableComplexMapKeySerialization()方法对Map<String,Object>并没有影响。
接下来我们查看Map<Object,String>

    private static GsonBuilder getGsonBuilder() {
        return new GsonBuilder().enableComplexMapKeySerialization();
    }

    private static void testMap2() {
        Map<Empolyee, String> map = new HashMap<>();
        for (int i = 0; i < 3; i++) {
            map.put(new Empolyee("longxia", i, 10d + i), "" + i);
        }
        String result = getGson().toJson(map);
        System.out.println(result);
        result = getGson().toJson(map, map.getClass());
        System.out.println(result);
        result = getGson().toJson(map, new TypeToken<Map<Empolyee, String>>() {
        }.getType());
        System.out.println(result);
    }

输出结果为


[[{"name":"longxia","department":1.0,"score":11.0},"1"],[{"name":"longxia","department":2.0,"score":12.0},"2"],[{"name":"longxia","department":0.0,"score":10.0},"0"]]
[[{"name":"longxia","department":1.0,"score":11.0},"1"],[{"name":"longxia","department":2.0,"score":12.0},"2"],[{"name":"longxia","department":0.0,"score":10.0},"0"]]
[[{"name":"longxia","department":1.0,"score":11.0},"1"],[{"name":"longxia","department":2.0,"score":12.0},"2"],[{"name":"longxia","department":0.0,"score":10.0},"0"]]

诶?这里怎么就变成JSON数组了呢?同时必须加enableComplexMapKeySerialization()方法,否则会是他的内存地址如下:

{"com.company.util.GsonUtil$Empolyee@721e0f4f":"1","com.company.util.GsonUtil$Empolyee@28864e92":"2","com.company.util.GsonUtil$Empolyee@546a03af":"0"}
{"com.company.util.GsonUtil$Empolyee@721e0f4f":"1","com.company.util.GsonUtil$Empolyee@28864e92":"2","com.company.util.GsonUtil$Empolyee@546a03af":"0"}
{"com.company.util.GsonUtil$Empolyee@721e0f4f":"1","com.company.util.GsonUtil$Empolyee@28864e92":"2","com.company.util.GsonUtil$Empolyee@546a03af":"0"}

所以这里面有两个问题:
1.为什么Map<String,Object>序列化和Map<Object,String>序列化表现的不一样?
Map<String,Object>序列化会将对象序列化为josn串,但是Map<Object,String>会将对象序列化为多维数组?
2.enableComplexMapKeySerialization()的作用是什么?
现在我们继续查看反序列化
我们先试下这种字符串

{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}

代码如下:

    private static void testDesMap(){
        String srcJson = "{\"0\":{\"name\":\"longxia\",\"department\":0.0,\"score\":10.0},"
                + "\"1\":{\"name\":\"longxia\",\"department\":1.0,\"score\":11.0},"
                + "\"2\":{\"name\":\"longxia\",\"department\":2.0,\"score\":12.0}}";
        Map<String,Empolyee> map = new HashMap<>();
        map = getGson().fromJson(srcJson,map.getClass());
        for (Map.Entry<String,Empolyee> entity : map.entrySet()){
            System.out.println(entity.getKey()+" "+entity.getValue());
        }
    }

输出代码

0 {name=longxia, department=0.0, score=10.0}
1 {name=longxia, department=1.0, score=11.0}
2 {name=longxia, department=2.0, score=12.0}

若是Map<Object,String>呢
原Json为:

[[{"name":"longxia","department":1.0,"score":11.0},"1"],[{"name":"longxia","department":2.0,"score":12.0},"2"],[{"name":"longxia","department":0.0,"score":10.0},"0"]]

测试代码:

    private static  void testDesMap2(){
        String srcJson = "[[{\"name\":\"longxia\",\"department\":1.0,\"score\":11.0},\"1\"],"
                + "[{\"name\":\"longxia\",\"department\":2.0,\"score\":12.0},\"2\"],"
                + "[{\"name\":\"longxia\",\"department\":0.0,\"score\":10.0},\"0\"]]";
        Map<Empolyee,String> map = new HashMap<>();
        map = getGson().fromJson(srcJson,map.getClass());
        for (Map.Entry<Empolyee,String> entity : map.entrySet()){
            System.out.println(entity.getKey()+" "+entity.getValue());
        }
    }

输出结果

{name=longxia, department=0.0, score=10.0} 0
{name=longxia, department=2.0, score=12.0} 2
{name=longxia, department=1.0, score=11.0} 1

总结:enableComplexMapKeySerialization并不影响Map<String,Object>和Map<Object,String>的反序列化。不管是多维数组还是字符串都是都以序列化为 Map。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值