将json字符串映射到枚举

时间:2018-05-02 17:35:33

标签: java json spring enums lombok

我有以下classenum s:

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){

}

由于an enum can be looked up by its name我想要做的是将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's @data attribute自动生成getter和setter,这对枚举绑定效果不佳(不确定原因)。
我想懒惰会带来代价。

1 个答案:

答案 0 :(得分:0)

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

public enum MyFirstEnum{
    MY_FIRST_ENUM1,
    MY_FIRST_ENUM2;

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

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

Imp Note(强制性)

MapTest 应该为两个枚举设置公共setter / getter(如果声明为私有,首选),或者将它们公开(应该避免,不是首选)