Java Jackson的枚举';s@JsonProperty
假设我有一个枚举:Java Jackson的枚举';s@JsonProperty,java,json,enums,jackson,Java,Json,Enums,Jackson,假设我有一个枚举: public enum ParameterList { FREQUENCY_ID("500"); ... lot's of different constants here ... private final String param; ParameterList(String param) { this.param = param; } @Override public Strin
public enum ParameterList {
FREQUENCY_ID("500");
...
lot's of different constants here
...
private final String param;
ParameterList(String param) {
this.param = param;
}
@Override
public String toString() {
return param;
}
}
假设我有一个带有字段的DTO:
private String frequency;
假设我有一个JSON
:
{"500" : "100Hz"}
我想将这个json
映射到我的dto
,因此dto.frequency
将有一个json的“500”
字段的值(即“100Hz”
)
我知道只有常量必须用作属性值,但是否有一些解决方法可以使以下工作正常进行
@JsonProperty(ParameterList.FREQUENCY_ID)
private String frequency;
(@JsonProperty
是com.fasterxml.jackson.annotation.JsonProperty
,版本2.8.0)
我们的想法是在枚举
参数列表时最小化代码编辑。FREQUENCY_ID
将从“500”
更改为其他值。json在{“admin”:“superuser”}
方面有点奇怪,如果它像{“role”:“superuser”}
(或者是userType而不是role),它会更清晰。但是,要将一个值映射到枚举,只需在DTO中指定它。对于您的json和一个枚举,也将超级用户
作为一个值
public enum UserType {
ADMIN, SUPERUSER
....
}
您所要做的就是使您的数据具有枚举类型
private UserType admin; // <-- admin because that's your key's name (maybe change that)
或者类似的东西,如果您无法更改json。您可以尝试以下方法:
public enum ParameterList {
FREQUENCY_ID(Constants.FREQUENCY_ID_VALUE);
private final String value;
ParameterList(String value) {
this.value= value;
}
@Override
public String toString() {
return value;
}
public static class Constants {
public static final String FREQUENCY_ID_VALUE = "500";
}
}
然后使用:
@JsonProperty(ParameterList.Constants.FREQUENCY_ID_VALUE)
private String frequency;
您希望在
DTO.something
中存储什么值<代码>“管理员”?我已经更新了我的问题。我想存储json中“admin”字段的值,使之成为DTO.something=“superuser”
。。。枚举在这种情况下适合什么?对不起,我误导了你。我的问题有点不同。我已经更新了这个问题,希望它更有意义now@baao不,不会的<代码>值必须是常量。对不起,我误导了您。我的问题有点不同。我已经更新了这个问题,希望它现在更有意义,因为JsonProperty需要一个编译时字符串。Java允许注释在编译时接受枚举,但前提是它们接受所需的类型。虽然它不能直接回答OP的问题,但它可能是一个解决方案。我仍然有兴趣看到一个解决方案,它可能需要一个接受正确类型枚举的自定义Jackson注释。@htshumb如果您使用的是常量,您甚至需要枚举吗?@RyanTheLeach我需要枚举,因为我在很多地方使用这个常量,而且有很多类似的常量。主要的一点是,由于新的需求,这个常数会不时地改变。我认为这个解决方案非常适合我的需要。
@JsonProperty(ParameterList.Constants.FREQUENCY_ID_VALUE)
private String frequency;