2014-09-24 3 views
2

Весь приведенный ниже код является упрощенной версией. У меня есть JSON структуру:Jackson использует индивидуальный десериализатор JSON по умолчанию

{ 
    "content" : { 
     "elements" : [ { 
      "type" : "simple" 
      }, 
      { 
      "type" : "complex", 
      "content" : { 
       "elements" : [ { 
        "type" : "simple" 
       }, 
       { 
        "type" : "simple" 
       }, 
       { 
        "type" : "complex", 
        "content" : { 
         ---- /// ---- 
        } 
       } ] 
      } 
     } ] 
    } 
} 

я использую Джексон LIB для десериализации, и я пытаюсь реализовать своего рода «смешивать» с обычаем по умолчанию deserializers. Я хочу, чтобы объект Element создавал с помощью пользовательского ElementDeserializer, но для поля Content внутри используется значение по умолчанию. К сожалению, такие вещи:

@JsonDeserialize(using = StdDeserializer.class) 
@JsonProperty 
Content content; 

не работает = (

Вот мой код прямо сейчас:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Content { 

    @JsonProperty("elements") 
    ArrayList<Element> mElements; 

} 

@JsonDeserialize(using = ElementDeserializer.class) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public class Element<T extends ElementType> { 

    @JsonProperty 
    Content content; 

    T mField; 

    public Element(T field) { 
     mField = field; 
    } 

} 

public class ElementDeserializer extends JsonDeserializer<Element> { 

    @Override 
    public Element deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { 
     Element element = null; 
     JsonNode node = jp.getCodec().readTree(jp); 
     if ("simple".equals(node.get("type").textValue())) { 
      element = new Element(new SimpleField()); 
     } else if ("complex".equals(node.get("type").textValue())) { 
      element = new Element(new ComplexField()); 
     } 
     return element; 
    } 
} 

Я буду благодарен за некоторую помощь

ответ

1

Не уверен в том, вам необходимо использовать собственный десериализатор (по причинам, не указанным в вашем сообщении). Если это не так, вы можете обойтись без него, используя десериализаторы по умолчанию.

Вот как:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class TopObject { 
    @JsonProperty 
    public Content content; 

    public TopObject() { 
    } 
} 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Content { 

    @JsonProperty 
    public Element elements []; 

    public Content() { 
    } 
} 

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
@JsonSubTypes({ 
    @Type(value = SimpleElement.class, name = "simple"), 
    @Type(value = ComplexElement.class, name = "complex") 
}) 
public class Element {  
    public Element() { 
    } 
} 

public class SimpleElement extends Element { 
    public SimpleElement() { 
    } 
} 

public class ComplexElement extends Element {  
    @JsonProperty 
    public Content content; 

    public ComplexElement() { 
    } 
} 

Затем десериализируются данные JSon как TopObject.class

+0

Спасибо большое за ваш ответ - очень интересно! Недавно я не знал о JsonTypeInfo и JsonSubTypes. Я постараюсь приспособить это решение к моему делу. – ADK

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