Pav*_*mar 4 java enums json jackson
这里有一个非常相似的问题-Jackson:将枚举值序列化和反序列化为整数,这涉及使用Jackson来枚举和反序列化枚举,其解决方案通过使用@JsonValue批注非常简单。
如果我们有一个带有如下整数字段的枚举,则此方法不起作用。
enum State{
GOOD(1), BAD(-1), UGLY(0);
int id;
State(int id) {
this.id = id;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们的要求是序列化并提供实际值而不是name()。说,就像{"name":"foo","state":1}代表foo表示良好。@JsonValue仅在序列化的情况下添加注释才有帮助,反序列化失败。如果我们没有字段,则意味着GOOD = 0,BAD = 1,UGLY = 2 @JsonValue就足够了,并且当字段存在时Jackson不能反序列化-0和1的映射错误,-1的异常。
这可以使用Jackson批注实现@JsonCreator。对于序列化,使用的方法@JsonValue可以返回int,对于反序列化,使用的static方法@JsonCreator可以接受int in参数,如下所示。
以下代码供参考:
enum State{
GOOD(1), BAD(-1), UGLY(0);
int id;
State(int id) {
this.id = id;
}
@JsonValue
int getId() {
return id;
}
@JsonCreator
static State fromId(int id){
return Stream.of(State.values()).filter(state -> state.id == id).findFirst().get();
}
}
Run Code Online (Sandbox Code Playgroud)
注意:这是Jackson库上的一个打开的错误-https: //github.com/FasterXML/jackson-databind/issues/1850