java fastjson如何自定义转换含枚举类型对象(编程技巧)
来源:互联网 发布:手机cpu监控软件 编辑:程序博客网 时间:2024/05/18 00:39
在使用fastjson对java对象进行序列化和反序列化时,如果含有枚举类型,默认会根据枚举变量的ordinal值进行反序列且序列化时显示枚举字面代表的字符串。经常这种行为不是我们想要的,那么如何进行定制化枚举类型的序列化和反序列? 举例如下
问题引出
假设待序列化和反序列化java对象结构如下
public class Msg { private int id; private StatusCodeEnum status; public int getId() { return id; } public void setId(int id) { this.id = id; } public StatusCodeEnum getStatus() { return status; } public void setStatus(StatusCodeEnum status) { this.status = status; } public static enum StatusCodeEnum { OK(200, "正常"), SERVER_ERROR(500, "服务器错误"); private static final Map<Integer, StatusCodeEnum> CODE_MAP = new HashMap<Integer, StatusCodeEnum>(); static { for (StatusCodeEnum typeEnum : StatusCodeEnum.values()) { CODE_MAP.put(typeEnum.getCode(), typeEnum); } } StatusCodeEnum(int code, String meaning) { this.code = code; this.meaning = meaning; } public int getCode() { return code; } public String getMeaning() { return meaning; } public static StatusCodeEnum getEnum(Integer code) { return CODE_MAP.get(code); } private final int code; private final String meaning; }}
对象内部定义了状态码枚举类StatusCodeEnum,包含两个实例OK、SERVER_ERROR。
反序列化问题
如何使用fastjson成功反序列如下json串?
{“id”:1,”status”:200}
显然,如果直接用Json.parseObject()方法进行反序列化,会报如下错误信息:
Exception in thread “main” com.alibaba.fastjson.JSONException: parse
enum com.netwaymedia.exhibition.nio.common.dto.Msg$StatusCodeEnum
error, value : 200 at
com.alibaba.fastjson.parser.deserializer.EnumDeserializer.deserialze(EnumDeserializer.java:48)
at
com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:33)
原因分析:前面已经提过,fastjson默认使用ordinal值去查找对应的枚举实例,显示是获取不到的,所以抛出异常,需要修改status值为0才运行OK。
序列化问题
如果使用JSON.toJSONString()方法对上述Msg对象进行序列化,会得到如下json串
{“id”:1,”status”:”OK”}
显示不是我们所期待的原始字符串
{“id”:1,”status”:200}
如何解决上述两大问题?
优雅的解决方案
答案就在于fastjson提供注解JSONField。通过JSONField可灵活控制字段的序列化和反序列,重新修改Msg结构如下:
public class Msg { private int id; private StatusCodeEnum statusCode; public int getId() { return id; } public void setId(int id) { this.id = id; } @JSONField(name = "status") public int getStatus() { return statusCode.getCode(); } @JSONField(name = "status") public void setStatus(int code) { this.statusCode = StatusCodeEnum.getEnum(code); } @JSONField(serialize = false) public StatusCodeEnum getStatusCode() { return statusCode; } @JSONField(deserialize = false) public void setStatusCode(StatusCodeEnum statusCode) { this.statusCode = statusCode; } public static enum StatusCodeEnum { OK(200, "正常"), BAD_REQUEST(400, "服务器出错"); private static final Map<Integer, StatusCodeEnum> CODE_MAP = new HashMap<Integer, StatusCodeEnum>(); static { for (StatusCodeEnum typeEnum : StatusCodeEnum.values()) { CODE_MAP.put(typeEnum.getCode(), typeEnum); } } StatusCodeEnum(int code, String meaning) { this.code = code; this.meaning = meaning; } public int getCode() { return code; } public String getMeaning() { return meaning; } public static StatusCodeEnum getEnum(Integer code) { return CODE_MAP.get(code); } private final int code; private final String meaning; }}
思路是通过修改字段名为statusCode,并用JSONField注解该字段不进行序列和反序列化,但是提供getStatus/setStatus方法来定制化枚举变量statusCode的序列和反序列,完美的解决前面提到的两大问题。
这个方法我在网上还没看到过,是我自己尝试出来的,特别拿出来跟大家分享,不用谢,请叫我雷锋。
- java fastjson如何自定义转换含枚举类型对象(编程技巧)
- java fastjson如何自定义转换含枚举类型对象(编程技巧)
- fasterxml如何对Java枚举类型做类型转换
- fastjson枚举转换
- 枚举类型如何转换成字符串类型
- FastJson Date类型自定义
- java对象类型转换
- fastjson 使用 string字符串转换成java的各种类型
- java类型 转换小技巧
- fastjson java对象和JSON的相互转换
- Java中Random自定义的枚举类型
- java 枚举类型与int转换
- 【Java编程高级进阶】如何使用自定义类型的异常?
- 编程技巧:C#中的Cast By Example(如何将弱类型的匿名类型参数转换为强类型)
- 《Java 编程思想》--第十九章:枚举类型
- 枚举类型 Java编程思想 读书笔记
- Java编程思想-19枚举类型
- Java编程思想之枚举类型
- SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
- Python 模拟登录新浪微博
- 第16周-项目2-用文件保存学生名单
- 邻接表存储图的深度优先、广度优先遍历非递归算法
- tomcat-redis-session管理 使用说明
- java fastjson如何自定义转换含枚举类型对象(编程技巧)
- iOS 编译包含 bitcode 的 fdk-aac 静态库(包含 arm64)
- nodejs + request + cheerio 抓取页面指定的信息
- 集合大家族--Java
- vim技巧
- 调用 android 自身裁剪功能
- jquery获取子节点和父节点的示例代码
- Oracle如何显示出小数点前后的0
- Java 垃圾回收机制