这里有一个非常相似的问题 - Jackson: Serialize and deserialize enum values as integers处理使用Jackson序列化和反序列化其解决方案非常简单的枚举,使用@JsonValue
注释。
如果我们有一个带有如下整数字段的枚举,这不起作用。
enum State{
GOOD(1), BAD(-1), UGLY(0);
int id;
State(int id) {
this.id = id;
}
}
如果我们的要求是序列化并提供实际值而不是name()
。比方说,像{"name":"foo","state":1}
这样的东西代表了好的foo。添加@JsonValue
注释仅在序列化的情况下有用,并且无法进行反序列化。如果我们没有字段,意味着GOOD = 0,BAD = 1,UGLY = 2,@JsonValue
就足够了,杰克逊在字段存在时无法反序列化 - 错误的映射为0和1,异常为-1。
答案 0 :(得分:4)
这可以使用Jackson注释@JsonCreator
来实现。对于序列化,@JsonValue
的方法可以返回int,对于反序列化,static
方法@JsonCreator
可以接受参数中的int,如下所示。
以下代码供参考:
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();
}
}
注意:这是目前杰克逊图书馆的一个漏洞 - https://github.com/FasterXML/jackson-databind/issues/1850
答案 1 :(得分:0)
我在其他解决方案上遇到了问题。这对我有用(Jackson 2.9.9):
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
enum State{
GOOD(1), BAD(-1), UGLY(0);
int id;
State(int id) {
this.id = id;
}
@JsonValue
int getId() { return id; }
}