fastjson小技巧——使用fastjson对枚举的序列化,返回属性code/desc等——一看就会
程序员文章站
2022-06-07 22:43:37
...
场景:
在使用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的路上修行