欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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的路上修行