2011-01-01 6 views
2
children: [ 
     { 
      o kind: "t3" 
      data: {     // ExampleNodeT3 class should be used for kind == t3 
       + t3var1: "val1" 
       + t3var2: true 
      } 
     } 
     { 
      o kind: "t4"     
      data: {     // ExampleNodeT4 class should be used for kind == t4 
       + t4var1: false 
       + t4var2: 2346 
      } 
     } 
] ... etc. 


@JsonTypeInfo(use=Id.NAME, property="kind") 
@JsonSubTypes({ 
@Type(value=ExampleNodeT3.class, name="t3"), 
@Type(value=ExampleNodeT4.class, name="t4")}) 
public abstract class ExampleNode { 
... 
public void setData(ExampleNode data) { 
    this.data = data; 
} 

При попытке десериализовать это с помощью Jackson подсказки JsonTypeInfo завершаются сбоем при создании данных ExampleNode, поскольку свойство «kind» ассоциировано со своим родителем и не видно. Я пробовал различные варианты заводских методов и аннотации Джексона, но поскольку Джексон создает объект ExampleNode и передает его самому setData(), я не вижу места для управления тем, какой класс объекта создается.Использовать свойство родительского объекта для определения подкласса при десериализации?

+0

Видимо, эта функциональность не представляется возможным. Усовершенствование функции было запрошено здесь: http://jira.codehaus.org/browse/JACKSON-275 – phreakocious

+0

И подробности проблемы находятся здесь: http://jackson-users.ning.com/forum/topics/how- to-use-a-property-of? commentId = 5286555% 3AComment% 3A2679 – phreakocious

ответ

1

Правильно - использование «идентификаторы внешнего типа» (те, которые не содержится в пределах объекта для десериализации, но, как братья и сестры) является еще не поддержаны.

Это может быть реализовано (так как в нем нет ничего существенного, чтобы предотвратить добавление поддержки) - за исключением упомянутой выше проблемы Jira, которая может помочь, может быть подан новый запрос функции для прямого запроса возможности использования таких идентификаторов типов. Это было упомянуто несколькими пользователями; возможно, поскольку существуют форматы данных (geoJSON?), которые используют такую ​​структуру ввода.

+0

Запрашивается здесь: http://jira.codehaus.org/browse/JACKSON-453 – phreakocious

2

Получил отсюда Google и нашел решение. на самом деле в эти дни его возможным благодаря включают = JsonTypeInfo.As.EXTERNAL_PROPERTY, например:

public class Parent { 

    @JsonProperty("type") 
    public String type; 

    @JsonProperty("data") 
    @JsonInclude(Include.NON_NULL) 
    public ChildBase ChildBase; 

    public Parent() { 
     medias = new HashMap<>(); 
    } 

    @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.EXTERNAL_PROPERTY, property="type") 
    @JsonTypeIdResolver(ChildBaseByParentTypeResolver.class) 
    public void setChildBase(ChildBase ChildBase){ 
     this.ChildBase = ChildBase; 
    } 
} 


@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class ChildBase { 
     public String someStr; 

} 


@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class AggressiveChild extends ChildBase{ 
    public String someStr1; 

} 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class ChilledChild extends ChildBase{ 
    public String someStr1; 

} 


public class ChildBaseByParentTypeResolver extends TypeIdResolverBase { 

    private JavaType superType; 

    @Override 
    public void init(JavaType baseType) { 
     superType = baseType; 
    } 

    @Override 
    public Id getMechanism() { 
     return Id.NAME; 
    } 

    @Override 
    public JavaType typeFromId(DatabindContext context, String id) { 
     Class<?> subType = ChildBase.class;  
     switch (id) { 
     case "agressiveParent":   
      subType = AggressiveChild.class; 
      break; 
     case "chilledParent":   
      subType = ChilledChild.class; 
      break;   
     } 
     return context.constructSpecializedType(superType, subType);   
    } 

    @Override 
    public JavaType typeFromId(String directiveType) { 
     throw new NotImplementedException(); 
    } 

} 

Интересные статьи:

Polymorphism with jackson friend

Related stack overflow question

 Смежные вопросы

  • Нет связанных вопросов^_^