首页 > 解决方案 > 将 json 字符串映射到枚举

问题描述

我有以下classenums:

import lombok.Data;
// other imports...

@Data
public class MapTest{
    private MyFirstEnum myFirstEnum;
    private MySecondEnum mySecondEnum;
}

public enum MyFirstEnum{
    MY_FIRST_ENUM1,
    MY_FIRST_ENUM2
}

public enum MySecondEnum {
    MY_SECOND_ENUM1,
    MY_SECOND_ENUM2
}

和这个弹簧控制器:

@PostMapping("/testMap")
@ResponseBody
public void TestMap(@RequestBody MapTest mapTest){

}

由于可以通过其名称查找枚举,因此我想做的是将 a 发布json到控制器,并且适当的道具将按其名称进行序列化:

{
    "myFirstEnum": "MY_FIRST_ENUM1",
    "mySecondEnum": "MY_SECOND_ENUM2"
}

我试图设置一个@JsonDeserialize但我无法在被覆盖的函数中获取枚举的类型:

// what type should i use here?
public static class StringToEnum extends JsonDeserializer<???> {
    // how do i get the type of the current enum?
    @Override
    public ??? deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ??? res = Enum.valueOf(p.getText());
        return res;
    }
}

更新: 我没有提到我正在使用lombok 的 @data 属性来自动生成 getter 和 setter,这不适用于枚举绑定(不知道为什么)。
我想懒惰是有代价的。

标签: javajsonspringenumslombok

解决方案


它应该通过杰克逊自动序列化,但您可以通过@JsonCreator
强制它 重新定义您的枚举为

public enum MyFirstEnum{
    MY_FIRST_ENUM1,
    MY_FIRST_ENUM2;

    @JsonCreator
    public static MyFirstEnum fromString(String raw) {
        return MyFirstEnum.valueOf(raw.toUpperCase());
    }
}

同样以类似的方式定义您的第二个枚举。

进出口票据(强制性)

MapTest应该有两个枚举的公共设置器/获取器(如果声明为私有,则首选),或将它们声明为公共(应该避免,不是首选)


推荐阅读