【json】与【枚举】的序列化和反序列化

时间:2023-01-02 19:45:08

参考: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()));
}

【json】与【枚举】的序列化和反序列化

代码

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】与【枚举】的序列化和反序列化

【json】与【枚举】的序列化和反序列化的更多相关文章

  1. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化

    度娘许久,找不到我满意的答案,于是自己东凑西凑实现一个. DynamicObject扩展--实现JSON和DynamicObject的序列化与反序列化,亲测良好. 看代码 using System; ...

  2. json相关注解和序列化与反序列化

    使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以用以下的注解方式完成当属性为null时不参与序列化: @JsonSerial ...

  3. JSON与对象的序列化与反序列化

    一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...

  4. ASP&period;NET中JSON对时间进行序列化和反序列化

    JSON格式不直接支持日期和时间.DateTime值显示为“/Date(0+0800)/”形式的JSON字符串,其中第一个数字是GMT时区中自1970年1月1 日午夜以来按正常时间(非夏令时)经过的毫 ...

  5. C&plus;&plus; 基于rapidjson对json字符串的进行序列化与反序列化

    json字符串的解析以封装在我们开发过程中经常见到, 尤其在socket通信上面, 在一次项目中碰到json字符串的进行解析, 而公司有没有封装好的库, 于是就自己基于开源的库进行了一次封装, 接下是 ...

  6. Newtonsoft&period;Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  7. 【转】Newtonsoft&period;Json 的序列化与反序列化

    http://www.cnblogs.com/08shiyan/p/3464028.html 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Fr ...

  8. Json&period;Net序列化和反序列化设置

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  9. Json&period;Net系列教程 3&period;Json&period;Net序列化和反序列化设置

    原文 Json.Net系列教程 3.Json.Net序列化和反序列化设置 上节补充 首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framewo ...

随机推荐

  1. java异常和spring事务注解

    http://www.techferry.com/articles/spring-annotations.html http://www.oschina.net/question/2367675_23 ...

  2. &lbrack;Irving&rsqb; Wpf DevexPress GridControl 获取选中行

    WPF前台绑定事件代码: <RelayAction TargetControl="{Binding ElementName=GCInstoragePart}" MethodN ...

  3. &UpperRightArrow;☻【HTML5秘籍 &num;BOOK&num;】第2章 构造网页的新方式

    div division 分区article 表示一个完整的.自成一体的内容块,比如博文文章或新闻报道hgroup 标注副标题 从结构上讲,它只关注*标题(也就是这里的h1).其他标题也会显示在浏览 ...

  4. document&lowbar;index&lowbar;data&period;go

    package types type DocumentIndexData struct {     // 文档全文(必须是UTF-8格式),用于生成待索引的关键词     Content string ...

  5. 007&lowbar;Chrome的Waterfall详解

    一. 浏览器根据html中外连资源出现的顺序,依次放入队列(Queue),然后根据优先级确定向服务器获取资源的顺序.同优先级的资源根据html中出现的先后顺序来向服务器获取资源 Queueing. 出 ...

  6. BZOJ&period;4559&period;&lbrack;JLOI2016&rsqb;成绩比较&lpar;DP&sol;容斥 拉格朗日插值&rpar;

    BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...

  7. cf444E&period; DZY Loves Planting&lpar;并查集&rpar;

    题意 题目链接 Sol 神仙题啊Orzzzzzz 考场上的时候直接把树扔了对着式子想,想1h都没得到啥有用的结论. 然后cf正解居然是网络流??出给NOIP模拟赛T1???¥%--&((--% ...

  8. mysql-新增表前判断同名表是否存在

    新增多个表时,如果有同名表会报错,导致其中一个表不能正确创建,此时可以用以下语句进行判断: DROP TABLE IF EXISTS USER; --判断表是否存在,如果存在就删除! CREATE T ...

  9. iOS URL Loading System &sol; HTTP 重定向 认识与学习

    一个朋友问了我一个问题,需求是这样的:他要用本地的H5资源 替换 链接资源,  但是判断链接资源时候 因为一些操作请求本地化了之后  一些操作比如请求服务器使用的是http开头,然而本地资源一直是以f ...

  10. 365&period; Water and Jug Problem &lpar;GCD or BFS&rpar; TBC

    https://leetcode.com/problems/water-and-jug-problem/description/ -- 365 There are two methods to sol ...