【json】与【枚举】的序列化和反序列化
参考:Jackson – Deserialization from json to Java enums
问题描述
java中使用枚举时,如果涉及到restful调用,不可避免会涉及到枚举的序列化和反序列化工作;
如定义如下枚举
public enum ResType {
INSTANCE("虚拟机", "INSTANCE");
private String name;
private String type;
ResType(String name, String type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
上面代码默认的序列化结果为:
{
"resType": "INSTANCE"
}
如果我们期望序列化的结果为:
{
"resType": {
"name": "虚拟机",
"type": "INSTANCE"
}
}
在需要修改上面的枚举类,最简单的方法是添加:@JsonFormat(shape = JsonFormat.Shape.OBJECT)
添加之后,序列化结果变为:更多的序列化可参考:官方序列化示例
{
"resType": {
"name": "虚拟机",
"type": "INSTANCE"
}
}
但此时若是使用上述结果进行反序列化操作,将会报错,解决方式可参考文章顶部链接:即添加如下代码
/**
* 用于保存所有的枚举值
*/
private static Map<String, ResType> RESOURCE_MAP = Stream
.of(ResType.values())
.collect(Collectors.toMap(s -> s.getType(), Function.identity()));
/**
* 枚举反序列话调用该方法
*
* @param jsonNode
* @return
*/
@JsonCreator //必须修饰static方法
public static ResType des(final JsonNode jsonNode) {
return Optional
.ofNullable(RESOURCE_MAP.get(jsonNode.get("type").asText()))
.orElseThrow(() -> new IllegalArgumentException(jsonNode.get("type").asText()));
}

代码
controller
@RestController
@RequestMapping("v1")
public class MyController {
@Autowired
private MyService myService;
@GetMapping(value = "/my/model")
public Response<?> endFloatingIpRateTask() {
return Response.success(myService.getModel());
}
/**
* 请求示例:
* <pre>
* {
* "productId": "product01",
* "resType": {
* "name": "虚拟机",
* "type": "INSTANCE"
* }
* }
* </pre>
*
* @param taskResource
* @return
*/
@PostMapping(value = "/set/model")
public Response<?> xxx(@RequestBody MyTaskResource taskResource) {
System.out.println("xxxxxxxxxxxx");
System.out.println(taskResource);
System.out.println("xxxxxxxxxxxx");
return Response.success(taskResource);
}
}
service
@Service
public class MyService {
public MyTaskResource getModel() {
MyTaskResource m = new MyTaskResource();
m.setResType(ResType.INSTANCE);
m.setProductId("product01");
return m;
}
}
model
public class MyTaskResource {
private String productId;
private ResType resType;
public ResType getResType() {
return resType;
}
public void setResType(ResType resType) {
this.resType = resType;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("productId", productId)
.add("resType", resType)
.toString();
}
}
枚举
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum ResType {
INSTANCE("虚拟机", "INSTANCE");
/**
* 用于保存所有的枚举值
*/
private static Map<String, ResType> RESOURCE_MAP = Stream
.of(ResType.values())
.collect(Collectors.toMap(s -> s.getType(), Function.identity()));
private String name;
private String type;
ResType(String name, String type) {
this.name = name;
this.type = type;
}
/**
* 枚举反序列话调用该方法
*
* @param jsonNode
* @return
*/
@JsonCreator
public static ResType des(final JsonNode jsonNode) {
return Optional
.ofNullable(RESOURCE_MAP.get(jsonNode.get("type").asText()))
.orElseThrow(() -> new IllegalArgumentException(jsonNode.get("type").asText()));
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
测试结果

【json】与【枚举】的序列化和反序列化的更多相关文章
- DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化
度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化,亲测良好. 看代码 using System; ...
- json相关注解和序列化与反序列化
使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以用以下的注解方式完成当属性为null时不参与序列化: @JsonSerial ...
- JSON与对象的序列化与反序列化
一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...
- ASP.NET中JSON对时间进行序列化和反序列化
JSON格式不直接支持日期和时间.DateTime值显示为“/Date(0+0800)/”形式的JSON字符串,其中第一个数字是GMT时区中自1970年1月1 日午夜以来按正常时间(非夏令时)经过的毫 ...
- C++ 基于rapidjson对json字符串的进行序列化与反序列化
json字符串的解析以封装在我们开发过程中经常见到, 尤其在socket通信上面, 在一次项目中碰到json字符串的进行解析, 而公司有没有封装好的库, 于是就自己基于开源的库进行了一次封装, 接下是 ...
- Newtonsoft.Json 的序列化与反序列化
首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...
- 【转】Newtonsoft.Json 的序列化与反序列化
http://www.cnblogs.com/08shiyan/p/3464028.html 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Fr ...
- Json.Net序列化和反序列化设置
首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...
- Json.Net系列教程 3.Json.Net序列化和反序列化设置
原文 Json.Net系列教程 3.Json.Net序列化和反序列化设置 上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framewo ...
随机推荐
- git怎么fork一个仓库并pull request
一.使用git push <-----------就是这个玩意 1.设置用户信息 当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址. 这样做很重要,因为每一个 Git 的提交都会 ...
- sql 双表或多表的连接查询 join
使用 inner join,left join, right join.full join 对双表进行联合查询. 1.inner join.join:如果表中有至少一个匹配,则返回行. 2.left ...
- OFBiz项目简介
记得最早使用OFBiz是十年前在公司的一个EA游戏项目中,用来实现玩家在游戏中购买各种游戏装备.当由于自己刚出校门不久,经验也少,对软件产品架构.思想.目的了解不透彻,不明白OFBiz设计上的优点,本 ...
- svn linux 服务器的搭建
1 查询是否安装了svn: rpm -qa subversion 2:如果没有那么: yum -y install subversion 3:建立一个存储路经:mkdir -p /applicati ...
- 最新vue.js完整视频教程12套
0.1智能社vuejs(1-11章全套) 0.2英文版learing vuejs 0.3Vue.js实战小米阅读开发 0.4走进Vue.js2.0 0.5Vuejs教程45节课 0.6Vue.js+N ...
- 从hivesql结果中读取数值到shell变量的方法
为了检查hive表中的数据,并统计展现,需要将查出的结果传入到shell变量,然后统一输出到文本. 最后使用了以下两个方法: 方法一 QUAN=$(hive -S -e "select co ...
- python从零开始 -- 第1篇之环境搭建
事实上,网络上有很多相应的教程,本文无意做成文章的粘贴展示板,附上我认为的简易的安装详解: 安装 Python 环境(编程小白的第一本 Python 入门书),包含了python以及相关的IDE,图文 ...
- CSS-动画巧用translated3d
VUE2.0单元素或组件的过渡 情景:插件从右向左滑动,巧用translate3d .food position :fixed left : 0 top :0 bottom :48px z-index ...
- bash内建命令
bash内建命令 1.local命令 基本介绍 local命令是用来定义一个局部变量的,它只能定义在函数中,并且随着函数的结束而被销毁 基本语法 local [option] name[=valu ...
- HOMEWORD2
开发工具和语言选择 语言 :pyhton3.6 工具 我选择的是 pycharm2019.1.由于之前已经安装好了,这里就不再贴出. 自动单元测试练习 python单元测试框架Unittest.Uni ...