2016-04-14 8 views
1

Я работаю над webservice, где я должен предоставить xml в качестве ответа, я использую для этого джексон. Я застрял на вопрос, у меня есть абстрактный класс:jackson Список подклассов deserialisation

package com.spinner.jackson; 
import java.util.ArrayList; 
import java.util.List; 

import com.fasterxml.jackson.annotation.JsonTypeInfo; 
import com.fasterxml.jackson.annotation.JsonUnwrapped; 
import com.fasterxml.jackson.annotation.JsonValue; 
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText; 

public class ClientObject { 

    @JacksonXmlElementWrapper(useWrapping = false) 
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT) 
    private List<MyItem> accounts; 

    public ClientObject(List<MyItem> pl) { 
     this.accounts = pl; 
    } 

    public ClientObject() { 
     this.accounts = new ArrayList<MyItem>(); 
    } 

    @JsonDeserialize(using = CustomDeserial.class) 
    public void setL(List<MyItem> l) { 
     this.accounts = l; 
    } 

    public List<MyItem> getAccounts() { 
     // TODO Auto-generated method stub 
     return this.accounts; 
    } 
} 

, а затем у меня есть вложенные классы следующим образом:

пакета com.spinner.jackson;

import javax.xml.bind.annotation.XmlRootElement; 
import com.fasterxml.jackson.annotation.JsonCreator; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; 

@JacksonXmlRootElement(localName="itemA") 
public class MySubItemA extends MyItem { 

    public MySubItemA() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    public MySubItemA(int id, String name) { 
     super(id, name); 
     // TODO Auto-generated constructor stub 
    } 

    private String itemAProperty1; 
    private String itemAProperty2; 

    public String getItemAProperty1() { 
     return this.itemAProperty1; 
    } 

    public void setItemAProperty1(String itemAProperty1) { 
     this.itemAProperty1 = itemAProperty1; 
    } 

    public String getItemAProperty2() { 
     return this.itemAProperty2; 
    } 

    public void setItemAProperty2(String itemAProperty2) { 
     this.itemAProperty2 = itemAProperty2; 
    } 

    @JsonCreator 
    public MySubItemA(@JsonProperty("id")int id, @JsonProperty("name")String name, @JsonProperty("itemAProperty1")String p1, @JsonProperty("itemAProperty2")String p2) { 
     super(id, name); 
     this.itemAProperty1 = p1; 
     this.itemAProperty2 = p2; 
    } 

} 

другой подклассов

package com.spinner.jackson; 

import javax.xml.bind.annotation.XmlRootElement; 

import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; 

@JacksonXmlRootElement(localName="itemB") 
public class MySubItemB extends MyItem { 

    private int itemBProperty1; 
    private String itemBProperty2; 

    public int getItemBProperty1() { 
     return this.itemBProperty1; 
    } 

    public void setItemBProperty1(int itemBProperty1) { 
     this.itemBProperty1 = itemBProperty1; 
    } 

    public String getItemBProperty2() { 
     return this.itemBProperty2; 
    } 

    public void setItemBProperty2(String itemBProperty2) { 
     this.itemBProperty2 = itemBProperty2; 
    } 

    public MySubItemB(@JsonProperty("id")int id, @JsonProperty("name")String name, @JsonProperty("itemBProperty1")int p1, @JsonProperty("itemBProperty2")String p2) { 
     super(id, name); 
     this.itemBProperty1 = p1; 
     this.itemBProperty2 = p2; 
    } 
} 

и класс клиента, как следует:

package com.spinner.jackson; 
import java.util.ArrayList; 
import java.util.List; 

import com.fasterxml.jackson.annotation.JsonTypeInfo; 
import com.fasterxml.jackson.annotation.JsonUnwrapped; 
import com.fasterxml.jackson.annotation.JsonValue; 
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText; 

public class ClientObject { 

    @JacksonXmlElementWrapper(useWrapping = false) 
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT) 
    private List<MyItem> accounts; 

    public ClientObject(List<MyItem> pl) { 
     this.accounts = pl; 
    } 

    public ClientObject() { 
     this.accounts = new ArrayList<MyItem>(); 
    } 

    @JsonDeserialize(using = CustomDeserial.class) 
    public void setL(List<MyItem> l) { 
     this.accounts = l; 
    } 

    @JsonDeserialize(using = CustomDeserial.class) 
    public List<MyItem> getAccounts() { 
     // TODO Auto-generated method stub 
     return this.accounts; 
    } 
} 

MyItem Класс:

package com.spinner.jackson; 

import javax.xml.bind.annotation.XmlRootElement; 

import com.fasterxml.jackson.annotation.JsonSubTypes; 
import com.fasterxml.jackson.annotation.JsonSubTypes.Type; 
import com.fasterxml.jackson.annotation.JsonTypeInfo; 
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; 

@XmlRootElement 
public abstract class MyItem { 


    public MyItem() { 
     super(); 
     // TODO Auto-generated constructor stub 
    } 

    private int id; 
    private String name; 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public MyItem(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

} 

выше генерируют выходной XML, как следует

<ClientObject> 
    <accounts> 
     <MySubItemA> 
      .... 
     </MySubItemA> 
    </accounts> 
    <accounts> 
     <MySubItemB> 
      .... 
     </MySubItemB> 
    </accounts> 
</ClientObject> 

есть способ, чтобы удалить <accounts> оболочки, даже если я использую @JacksonXmlElementWrapper (useWrapping = ложь), а также, если удалить эту аннотацию он делает что-то, как следует

<ClientObject> 
    <accounts> 
     <accounts> 
      <MySubItemA> 
       .... 
      </MySubItemA> 
     </accounts> 
     <accounts> 
      <MySubItemB> 
       ..... 
      </MySubItemB> 
     </accounts> 
    </accounts> 
</ClientObject> 

так конечный результат должен быть

<ClientObject> 
     <MySubItemA> 
      .... 
     </MySubItemA> 
     <MySubItemB> 
      .... 
     </MySubItemB> 
</ClientObject> 

благодарит за вашу помощь.

С наилучшими пожеланиями Саджидом

+0

Вы пропустили абстрактный класс MyItem. – dambros

+0

спасибо, обновленный вопрос – Sajid

ответ

0

я был в состоянии понять это, так что я думаю, что это может помочь кому-то еще:

Я создал Serializer

package com.spinner.jackson; 

import java.io.IOException; 
import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.SerializerProvider; 

public class MySerial extends JsonSerializer<ClientObject> 
{ 
    public void serialize(ClientObject value, JsonGenerator jgen, 
SerializerProvider provider) 
     throws IOException, JsonProcessingException 
    { 
     jgen.writeObjectFieldStart(value.getClass().getSimpleName()); 
     jgen.writeObjectField(value.getAccounts().get(0).getClass().getSimpleName(), value.getAccounts().get(0)); 
     jgen.writeObjectField(value.getAccounts().get(1).getClass().getSimpleName(), value.getAccounts().get(1)); 
     jgen.writeObjectField(value.getAccounts().get(2).getClass().getSimpleName(), value.getAccounts().get(2)); 
     jgen.writeObjectField(value.getAccounts().get(3).getClass().getSimpleName(), value.getAccounts().get(3)); 

    } 

} 

и рядом я следующее ClientObject. java:

package com.spinner.jackson; 

import java.util.ArrayList; 
import java.util.List; 
import com.fasterxml.jackson.annotation.JsonTypeInfo; 
import com.fasterxml.jackson.databind.annotation.JsonSerialize; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; 

@JsonSerialize(using = CustomDeserial.class) 
public class ClientObject { 

    @JacksonXmlElementWrapper(useWrapping = false) 
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT) 
    private List<MyItem> accounts; 

    public ClientObject(List<MyItem> pl) { 
     this.accounts = pl; 
    } 

    public ClientObject() { 
     this.accounts = new ArrayList<MyItem>(); 
    } 

    public void setL(List<MyItem> l) { 
     this.accounts = l; 
    } 

    public List<MyItem> getAccounts() { 
     return this.accounts; 
    } 
} 

и вуаля работала, ч Это помогает кому-то.