Можно ли десериализовать перечисления, которые имеют один базовый индекс?
enum Status {
Active,
Inactive
}
{status: 1} означает Status.Active, но Jackson делает его Status.Inactive: (
Можно ли десериализовать перечисления, которые имеют один базовый индекс?
enum Status {
Active,
Inactive
}
{status: 1} означает Status.Active, но Jackson делает его Status.Inactive: (
Вы можете создать десериализатор настраиваемого типа для вашего перечисления:
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());
}
}
Затем вы можете сообщить Джексону использовать свой собственный десериализатор для свойства:
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;
}
}
Вы также можете настроить отображение объекта Jackson для использования своего десериализатора для всех вхождений целевого типа. См. http://wiki.fasterxml.com/JacksonHowToCustomDeserializers.
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);
}}
У перечислений есть числовые ординалы, начиная с нуля, и присваиваются каждому значению в перечислении в том порядке, в котором они были объявлены. Например, в вашем коде 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
(это не проблема Джексона), как объяснялось выше, ординалы в перечислении основаны на нуле. Возможно, вы должны исправить свой код, чтобы это отразить, и убедитесь, что {status:0}
означает Status.Active
.