java - 将 json 字符串映射到枚举
问题描述
我有以下class
和enum
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){
}
由于可以通过其名称查找枚举,因此我想做的是将 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,这不适用于枚举绑定(不知道为什么)。
我想懒惰是有代价的。
解决方案
它应该通过杰克逊自动序列化,但您可以通过@JsonCreator
强制它
重新定义您的枚举为
public enum MyFirstEnum{
MY_FIRST_ENUM1,
MY_FIRST_ENUM2;
@JsonCreator
public static MyFirstEnum fromString(String raw) {
return MyFirstEnum.valueOf(raw.toUpperCase());
}
}
同样以类似的方式定义您的第二个枚举。
进出口票据(强制性)
MapTest应该有两个枚举的公共设置器/获取器(如果声明为私有,则首选),或将它们声明为公共(应该避免,不是首选)
推荐阅读
- c++ - 添加两个列表并制作第三个列表 - 编译但不起作用
- r - 在 r 中使用 ggplot 将数据框的 n 列绘制为线
- javascript - 如何使用 Sinon.JS 存根承诺的方法?
- javascript - PDF.js 未以正确的页面顺序显示 PDF 文件
- vba - 引用表的 .DataBodyRange 的特定范围
- python - 使用 pandas 类别进行计算
- java - 带有 JSON 的 Volley Post - 获取 422 状态代码
- r - 检查每一行的数据框的条件,即逐行
- ios - 反应原生 iOS 未从 xcode 连接到打包程序
- azure - 使用 Azure AD 的 API 后端 (.NET Core) 中的身份验证基础知识