2014-07-02 36 views
5

Belirli bir özelliğe göre ayrıştırma alt sınıflarını eşlemek için @JsonTypeInfo ve @JsonSubTypes kullanıyorum. İşte benim ayrıştırmak istediğim örnek JSON'umun bir örneği. JSON ben görmezden isteyeyim tipi içerdiğinde sınıfaYoksay Jackson polimorfik eşlem eşlemesi

olarak bu kullanma

{ "animals": [ 
     { "type" : "dog", "name" : "spike" } 
    ,{ "type" : "cat", "name" : "fluffy" } 
]} 

Ancak sorun oluşur. Ben gerçekten bir nesne olarak serisini istemiyoruz "domuz" yeni bir tür varsa, örneğin,:

Could not resolve type id 'pig' into a subtype of [simple type, class Animal]

:

{ "animals": [ 
     { "type" : "dog", "name" : "spike" } 
    ,{ "type" : "cat", "name" : "fluffy" } 
    ,{ "type" : "pig", "name" : "babe" } 
]} 

ve bunu ayrıştırmak deneyin, bana bu hatayı verecektir

Yalnızca 'köpek' ve 'kedi' türündeki hayvanları eşleyebilmem ve başka her şeyi görmezden gelebilmem için nasıl düzeltebilirim?

+0

Sorununuzu çözdünüz mü? –

cevap

6

Kullandığınız Jackson sürümüne bağlı olarak JsonTypeInfo.defaultImpl ek açıklama ayarını java.lang.Void veya NoClass olarak ayarlayarak özel durumdan kaçınabilirsiniz. İşte

bir örnek:

public class JacksonUnknownType { 
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, 
      include = JsonTypeInfo.As.PROPERTY, 
      property = "type", defaultImpl = Void.class) 
    @JsonSubTypes({ 
      @JsonSubTypes.Type(value = Cat.class, name = "cat"), 
      @JsonSubTypes.Type(value = Dog.class, name = "dog")}) 
    public abstract static class Animal { 
     public String name; 
     @Override 
     public String toString() { 
      return getClass().getName() + " :: " + name; 
     } 
    } 

    public static class Dog extends Animal { 
    } 

    public static class Cat extends Animal { 
    } 

    public static final String JSON = "[\n" + 
      "  { \"type\" : \"dog\", \"name\" : \"spike\" }\n" + 
      "  ,{ \"type\" : \"cat\", \"name\" : \"fluffy\" }\n" + 
      "  ,{ \"type\" : \"pig\", \"name\" : \"babe\" }\n" + 
      "]"; 

    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     List<Animal> value = mapper.readValue(JSON, new TypeReference<List<Animal>>() {}); 
     System.out.println(value); 
    } 

} 

Çıktı: Ortaya çıkan koleksiyon Jackson bir hata olabilir 1 yerine bu 3 boş öğeleri içerir ama kolay olduğunu

[stackoverflow.JacksonUnknownType$Dog :: spike, stackoverflow.JacksonUnknownType$Cat :: fluffy, null, null, null] 

Not tahammül.

+0

Aslında bir özel deserializer rotası ile gittim, ancak bu, yalnızca belirli türleri göz ardı etmek istiyorsanız da çalışır. – geofrey