[Gson八]GsonBuilder序列化和反序列化选项enableComplexMapKeySerialization

编程技术  /  houtizong 发布于 3年前   160

enableComplexMapKeySerialization配置项的含义

 Gson在序列化Map时,默认情况下,是调用Key的toString方法得到它的JSON字符串的Key,对于简单类型和字符串类型,这没有问题,但是对于复杂数据对象,如果对象没有覆写toString方法,那么默认的toString方法将得到这个对象的Hash地址。

 

GsonBuilder用于为创建Gson对象设置配置选项,这些选项可以覆盖通过Gson gson = new Gson()创建的Gson对象,例如下面的例子代码:

 

不启用enableComplexMapKeySerialization并且不启动类型适配器(PointTypeAdapter)

 

import com.google.gson.Gson;import com.google.gson.GsonBuilder;import com.google.gson.reflect.TypeToken;import java.lang.reflect.Type;import java.util.HashMap;import java.util.Map;class Point {    private  int x;    private int y;    public int getX() {        return x;    }    public void setX(int x) {        this.x = x;    }    public int getY() {        return y;    }    public void setY(int y) {        this.y = y;    }}public class Test {    public static void main(String[]args) {        Map<Point, String> map = new HashMap<Point, String>();        Point p1 = new Point();        p1.setX(10);        p1.setY(10);        map.put(p1, "Ten");        Point p2 = new Point();        p2.setX(20);        p2.setY(20);        map.put(p2, "Twenty");        Gson gson  = new GsonBuilder().create();        String str = gson.toJson(map);        System.out.println(str);//{"test1.Point@5ba5ba75":"Ten","test1.Point@5d748654":"Twenty"}        Type type = new TypeToken<Map<Point,String>>(){}.getType();        map  = gson.fromJson(str, type);//java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING    }}
 代码输出 {"Point@6f92c766":"Twenty","Point@6406c7e":"Ten"},可见Key转换成字符串时,使用的Key.toString()方法(这里的Key是Point类型),这样转换结果基本是无法接受的,因为序列化出来的JSON串无法反序列化原来的Map集合。在上面的反序列化时,抛出异常因为Gson因为Point@6f92c766只是一个简单的字符串,无法转型为Point。

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客