2012-01-09 20 views

cevap

10

:

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.

3

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 Active0 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 1Inactive (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.

Sen enum için özel bir tip deserialiser oluşturabilir
+1

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

+2

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

44
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);   

}} 
+2

Bu aslında benimkinden daha basit, daha idiomatik bir çözüm. Paylaşım için teşekkürler. – Nathan

+0

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. –

+0

ama enum üçüncü tarafsa? – gstackoverflow

İlgili konular