fastjson小技巧——使用fastjson对枚举的序列化,返回属性code/desc等——一看就会

场景
在使用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的路上修行

你可能感兴趣的:(小小小知识点,java,json,fastjson,枚举)