Java Jackson-反序列化一个基枚举
是否可以反序列化具有基于一的索引的枚举Java Jackson-反序列化一个基枚举,java,json,enums,jackson,Java,Json,Enums,Jackson,是否可以反序列化具有基于一的索引的枚举 enum Status { Active, Inactive } {status:1}表示status.Active,但Jackson将其设为status.Inactive:(枚举有数字序数,从零开始,并按声明顺序分配给枚举中的每个值。例如,在代码中,Active有序数0和Inactive有序数1。您可以在枚举值和其序数之间来回移动,如这: // ordinal=0, since Active was declared first in the
enum Status {
Active,
Inactive
}
{status:1}表示status.Active,但Jackson将其设为status.Inactive:(枚举有数字序数,从零开始,并按声明顺序分配给枚举中的每个值。例如,在代码中,Active
有序数0
和Inactive
有序数1
。您可以在枚举值和其序数之间来回移动,如这:
// ordinal=0, since Active was declared first in the enum
int ordinal = Status.Active.ordinal();
// enumVal=Active, since 0 is the ordinal corresponding to Active
Status enumVal = Status.values()[0];
显然,序号
1
对应于Inactive
(这不是Jackson问题),如上所述,枚举中的序号是基于零的。也许您应该修复代码以反映这一点,并确保{status:0}
表示状态。活动
您可以为枚举创建自定义类型反序列化器:
public enum Status {
ACTIVE,
INACTIVE;
public static Status fromTypeCode(final int typeCode) {
switch(typeCode) {
case 1: return ACTIVE;
case 2: return INACTIVE;
}
throw new IllegalArgumentException("Invalid Status type code: " + typeCode);
}
}
public class StatusDeserializer extends JsonDeserializer<Status> {
@Override
public Status deserialize(final JsonParser parser, final DeserializationContext context) throws IOException {
return Status.fromTypeCode(parser.getValueAsInt());
}
}
您还可以将Jackson对象映射器配置为对目标类型的所有事件使用自定义反序列化程序。请参阅。该问题与序列化无关,如Oscar所说,与枚举(以及一般的计算机科学)无关是基于0的。如果是从另一层接收到的,则从数字中减去1。很明显,0表示状态。在java世界中处于活动状态!但这不是我的api,我只实现了一个客户端。api说1表示活动,2表示不活动。所以我的问题是,我是否可以让Jackson知道这一点。也许只需添加一个dummy值,用于将序号移位1。不建议使用枚举序号,更不用说在序列化中使用它们,因为更改枚举定义可能会更改序号。imho此答案无法回答问题。这实际上是一个比我更简单、更惯用的解决方案。感谢分享。这也是一个很好的解决方法处理使用未知大小写序列化枚举的常见问题。但如果枚举是第三方?@gstackoverflow,则可以使用Jackson mixins。
public class WarpDrive {
private Status status;
@JsonDeserialize(using = StatusDeserializer.class)
public void setStatus(final Status status) {
this.status = status;
}
public Status getStatus() {
return this.status;
}
}
public enum Status {
ACTIVE(1),
INACTIVE(2);
private final int value;
Status(int v) {
value = v;
}
@org.codehaus.jackson.annotate.JsonValue
public int value() {
return value;
}
@org.codehaus.jackson.annotate.JsonCreator
public static Status fromValue(int typeCode) {
for (Status c: Status.values()) {
if (c.value==typeCode) {
return c;
}
}
throw new IllegalArgumentException("Invalid Status type code: " + typeCode);
}}