1.需求
springboot实现对返回结果中的枚举实现序列化和对请求参数中的枚举(枚举某个字段)实现反序列化
2.实现
基于jackson自带注解实现对象序列化和反序列化
公共枚举类
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum DistanceEnum {
KILOMETER("km", 1000),
METER("meters", 1);
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public double getMeters() {
return meters;
}
private String unit;
private final double meters;
private DistanceEnum(String unit, double meters) {
this.unit = unit;
this.meters = meters;
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static DistanceEnum ofUnit(String unit) {
for (DistanceEnum value : values()) {
if (StringUtils.equals(value.unit,unit)) {
return value;
}
}
return null;
}
}
1. 枚举序列化
输出对象
@Data
@Accessors(chain = true)
public class UserOutDTO {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private DistanceEnum distance;
}
请求测试controller类
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(method = RequestMethod.GET, value = "/inTest")
public Object outTest(){
UserOutDTO userOutDTO = new UserOutDTO();
userOutDTO.setDistance(DistanceEnum.KILOMETER);
return userOutDTO;
}
}
请求接口返回
http://localhost:8080/user/outTest
{
"distance": {
"meters": 1000.0,
"unit": "km"
}
}
2.参数反序列化
输入对象
@Accessors(chain = true)
public class UserInDTO {
@JsonProperty(value = "distanceMeters", access = JsonProperty.Access.WRITE_ONLY)
private DistanceEnum distance;
}
请求测试controller类
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(method = RequestMethod.POST, value = "/inTest")
public Object inTest(@RequestBody UserInDTO userInDTO){
UserOutDTO userOutDTO = new UserOutDTO();
BeanUtils.copyProperties(userInDTO, userOutDTO);
return Collections.singleton(userOutDTO);
}
}
请求接口返回
通过postman请求及返回结果如下图