2015-04-17 2 views
0

Это популярная проблема для разработчиков Jackson JSON от FasterXML. Я столкнулся с этим, когда я был с POJOs: похожFasterXML Полиморфизм JSON Джексона с JsonSubTypes и JsonTypeInfo

package net.package.dogs.retrievers 

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "family") 
@JsonSubTypes(value = { 
    @JsonSubTypes.Type(value = LabradorRetriever.class), 
    @JsonSubTypes.Type(value = GoldenRetriever.class) 
}) 
public abstract class Retriever { 
    private String name; 
    private Color color; 

    public Retriever() {} 

    public Retriever(String name, Color color) { 
     this.name = name; 
     this.color = color; 
    } 

    public String bark() { 
     return "You can't hear me but I'm barking"; 
    } 
} 
package net.package.dogs.retrievers 

public class LabradorRetriever extends Retriever { 
    public LabradorRetriever() { 
     super(); 
    } 

    public LabradorRetriever(String name, Color color) { 
     super(name, color); 
    } 

    public String bark() { 
     return "Ruff! Ruff!"; 
    } 

    public String fetchDucks() { 
     return "ufff..."; 
    } 
} 
package net.package.dogs.retrievers 

public class GoldenRetriever extends Retriever { 

    public GoldenRetriever() { 
     super(); 
    } 

    public GoldenRetriever(String name, Color color) { 
     super(name, color); 
    } 

    public String bark() { 
     return "Wruuff! Wruff!"; 
    } 
} 
public enum Color { 
    YELLOW, 
    CHOCOLATE, 
    BLACK 
} 

Это классы соответствуют следующие JSON сообщений ...

{ 
    "family" : "net.package.dogs.retrievers.GoldenRetriever", 
    "name" : "Goldie", 
    "color" : "YELLOW" 
} 
{ 
    "family" : "net.package.dogs.retrievers.LabradorRetriever", 
    "name" : "Cookie", 
    "color" : "CHOCOLATE" 
} 

Но вместо Я хочу иметь другую разную «расу», следующим образом.

{ 
    "family" : "GOLDEN_RETRIEVER", 
    "name" : "Goldie", 
    "color" : "YELLOW" 
} 
{ 
    "family" : "LABRADOR_RETRIEVER", 
    "name" : "Cookie", 
    "color" : "CHOCOLATE" 
} 

Как я должен заполнить JsonTypeInfo и JsonSubTypes, чтобы соответствовать этому предыдущее сообщение JSON?

ответ

1

Вот один из способов вы можете сделать это:

  1. Изменение @JsonTypeInfo использовать JsonTypeInfo.Id.NAME:

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, ... 
    
  2. Добавить @JsonTypeName для разрешения имен:

    @JsonTypeName("LABRADOR_RETRIEVER") 
    public class LabradorRetriever extends Retriever { 
    
Смежные вопросы