场景: 在使用JSONObject.toJSONString(qsm)时,默认是打印枚举的name(),也就是枚举字面常量。有时候,返回前端,只想返回枚举里面的属性,比如代码标识code,或者描述,这样前端就不需要再存一套枚举与后端对应了。
思路: 可以将原本的枚举类型的属性不参与序列化和反序列化,再使用一个getter、setter方法来偷梁换柱的使用枚举值。这样就可以达到我们想要的效果。
举例说明:
public class LogController { public static void main(String[] args) { Qsm qsm = new Qsm(); qsm.setMyEnum(MyEnum.USAGE701); qsm.setName("QSM"); String s = JSONObject.toJSONString(qsm); //{"name":"QSM","status":"123"} Qsm qsm1 = JSONObject.parseObject(s, Qsm.class); //{"name":"QSM","status":"123"} } } @Data class Qsm { String name; @JSONField(serialize = false, deserialize = false) MyEnum myEnum; @JSONField(name = "status") public String getState() { return Optional.ofNullable(myEnum).map(MyEnum::getCode).orElse(null); } @JSONField(name = "status") public void setState(String code) { this.myEnum = MyEnum.getEnumByCode(code); } } @Getter @AllArgsConstructor enum MyEnum { USAGE701("123", "正在营业"); private String code; private String desc; private static final Map<String, MyEnum> CODE_MAP = new HashMap<>(); static { for (MyEnum typeEnum : MyEnum.values()) { CODE_MAP.put(typeEnum.getCode(), typeEnum); } } public static MyEnum getEnumByCode(String code) { return CODE_MAP.get(code); } }分析如下:我们本来的有一个属性为myEnum,类型为一个枚举MyEnum 。如果直接序列化,那么肯定为{"myEnum":"USAGE701","name":"QSM"},而现在我们序列化为{"name":"QSM","status":"123"}。得到了枚举的code,原因就是@JSONField(serialize = false, deserialize = false)将原来的字段不序列化和反序列化,并新增一个set方法和get方法,并指明@JSONField(name = "status"),get方法就是获取枚举的code,set方法就根据code获取枚举。
这样就可以达到序列化枚举时序列化得到其code、desc等属性。 【完】
正在去BAT的路上修行