Jackson - tek bir temel indeksi olan enumları serileştirmek mümkün mü?
enum Status {
Active,
Inactive
}
{durumu: 1} Status.Active anlamına gelir, ancak Jackson bu :(
Jackson - tek bir temel indeksi olan enumları serileştirmek mümkün mü?
enum Status {
Active,
Inactive
}
{durumu: 1} Status.Active anlamına gelir, ancak Jackson bu :(
:
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());
}
}
Ardından bir özellik için özel deserialiser kullanmak Jackson söyleyebilir:
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;
}
}
Ayrıca Jackson nesne yapılandırabilirsiniz Hedef türünün tüm oluşumları için özel serileştiricinizi kullanmak için eşleyici. Bakınız http://wiki.fasterxml.com/JacksonHowToCustomDeserializers.
Numaralamalar sıfır başlayarak sayısal sıra sayılarını sahiptir ve bir numaralandırma her değerine atanır Status.Inactive yapar ., beyan edildiği üzere Örneğin, kod Active
0
ve Inactive
sıralı 1
sahiptir sıra vardır böyle, bir enum değeri ve onun ordinal arasında ileri ve geri gidebilir.
// 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];
Açıkça, orjinal 1
Inactive
(bu bir Jackson problemi değildir), yukarıda açıklandığı gibi, bir numaralandırmadaki sıralamalar sıfır temellidir. Belki de bunu yansıtmak için kodunuzu düzeltmelisiniz ve {status:0}
'un Status.Active
anlamına geldiğinden emin olmalısınız.
Açık, bu 0 anlamına gelir. Java dünyasında etkin! Ama benim api'm değil, sadece bir müşteriyi uyguluyorum. Ve api, 1'in Aktif ve 2 Aktif Değil anlamına geldiğini söylüyor. Yani sorum şu ki, Jackson'ı bu konuda bilgilendirirsek. Belki de sıralamayı tek tek değiştirmek için bir kukla değer ekleyerek. – Dirk
Enum ordinallerinin kullanılması, seri hale getirilmesinde çok daha az kullanılması önerilir, çünkü Enum tanımındaki değişiklikler sıra sayılarını değiştirebilir. – florian
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);
}}
Bu aslında benimkinden daha basit, daha idiomatik bir çözüm. Paylaşım için teşekkürler. – Nathan
Bu, aynı zamanda, bilinmeyen büyük harf kullanımıyla serileştirilmiş sık rastlanan sayılar sorununu ele almanın harika bir yoludur. –
ama enum üçüncü tarafsa? – gstackoverflow
soru serileştirme –
gibi Oscar diyor, numaralandırma (ve genel olarak bilgisayar bilimleri) ile ilgisi yoktur 0 dayalıdır. Başka bir katmandan aldığınız bir şey varsa, sayıdan 1 çıkarın. – rynmrtn