2015-05-11 2 views
2

Моя строка ввода XML содержит список записей. Когда я десериализую его в объект с помощью jackson xmlmapper, я вижу только один элемент в списке. Родительские элементы были определены как общие объекты в POJO.Полный список элементов не отображается после десериализации XML-строки в объект с использованием XML-преобразователя Jackson

XML-строка (ITEMLIST содержит 3 элемента):

<msg> 
    <head> 
     <Client>MyClient</Client> 
     <RoutingArea>Test</RoutingArea> 
     <ServerId>ABCXYZ123</ServerId> 
    </head> 
    <body> 
     <UserDetailResponse> 
     <UserDetail> 
      <Customer> 
       <CustomerId>1456342711975</CustomerId> 
       <BusinessUnit>TEST0000</BusinessUnit> 
       <Name> 
        <Salutation>U</Salutation> 
        <First>TROPICAL TAN</First> 
       </Name> 
       <Privacy>Y</Privacy> 
      </Customer> 
      <ItemList> 
       <Count>3</Count> 
       <Item> 
        <ServiceIdentifier>000001</ServiceIdentifier> 
        <BillingIdentifier>000001</BillingIdentifier> 
       </Item> 
       <Item> 
        <ServiceIdentifier>000002</ServiceIdentifier> 
        <BillingIdentifier>000002</BillingIdentifier> 
       </Item> 
       <Item> 
        <ServiceIdentifier>000003</ServiceIdentifier> 
        <BillingIdentifier>000003</BillingIdentifier> 
       </Item> 
      </ItemList> 
     </UserDetail> 
     </UserDetailResponse> 
    </body> 
</msg> 

Java-код:

private final static XmlMapper mapper = new XmlMapper(); 

public static <T> T getXmlObject(String xml, Class<T> cls) throws IOException { 
    return mapper.readValue(xml, cls); 
} 

public static void main(String[] args) throws Exception { 
    String xmlString = "<msg><head><Client>MyClient</Client><RoutingArea>Test</RoutingArea><ServerId>ABCXYZ123</ServerId></head><body><UserDetailResponse><UserDetail><Customer><CustomerId>1456342711975</CustomerId><BusinessUnit>TEST0000</BusinessUnit><Name><Salutation>U</Salutation><First>TROPICAL TAN</First></Name><Privacy>Y</Privacy></Customer><ItemList><Count>3</Count><Item><ServiceIdentifier>000001</ServiceIdentifier><BillingIdentifier>000001</BillingIdentifier></Item><Item><ServiceIdentifier>000002</ServiceIdentifier><BillingIdentifier>000002</BillingIdentifier></Item><Item><ServiceIdentifier>000003</ServiceIdentifier><BillingIdentifier>000003</BillingIdentifier></Item></ItemList></UserDetail></UserDetailResponse></body></msg>"; 

    JacksonXmlModule jacksonXmlModule = new JacksonXmlModule(); 
    jacksonXmlModule.setDefaultUseWrapper(false); 

    MyResponse myResponse = getXmlObject(xmlString, MyResponse.class); 

    System.out.println("XML Object: \n" + myResponse.toString()); 

    ObjectMapper mapper = new ObjectMapper(); 
    String str = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(myResponse); 
    System.out.println("JSON : \n" + str); 

} 

POJO:

public class MyResponse { 

    private Object head; 

    private Object body; 

    public Object getHead() { 
     return head; 
    } 

    public void setHead(Object head) { 
     this.head = head; 
    } 

    public Object getBody() { 
     return body; 
    } 

    public void setBody(Object body) { 
     this.body = body; 
    } 

} 

Хотя есть 3 пунктов под ITEMLIST во входном XML string объект результата содержит только 3-й элемент.

Результат:

JSON : 
{ 
    "head" : { 
    "Client" : "MyClient", 
    "RoutingArea" : "Test", 
    "ServerId" : "ABCXYZ123" 
    }, 
    "body" : { 
    "UserDetailResponse" : { 
     "UserDetail" : { 
     "Customer" : { 
      "CustomerId" : "1456342711975", 
      "BusinessUnit" : "TEST0000", 
      "Name" : { 
      "Salutation" : "U", 
      "First" : "TROPICAL TAN" 
      }, 
      "Privacy" : "Y" 
     }, 
     "ItemList" : { 
      "Count" : "3", 
      "Item" : { 
      "ServiceIdentifier" : "000003", 
      "BillingIdentifier" : "000003" 
      } 
     } 
     } 
    } 
    } 
} 

ответ

0

Ваш пример не будет работать без объявления фактических типов head и body. Обычный Object приведет к тому, что body будет связан как Map, и с повторяющимися элементами с тем же именем сохраняется только последний. Основные проблемы заключаются в том, что XML не имеет никакого различия между массивами и объектами (в отличие от JSON), и единственный способ разрешить разницу заключается в информации из классов Java. Поэтому вам нужно иметь что-то с List или тип массива, чтобы связывать вещи как массивы.

+0

Хм .. Мне нужно будет изменить подход. JSON - это вход для моего приложения. С Spring web я получаю pojo, а затем конвертирую его в xml для вызова внешнего интерфейса. XML-ответ внешнего интерфейса преобразуется в pojo. Раньше в проблему с несколькими элементами. Спасибо за быстрый ответ! – Sparkle8

+0

У меня есть XSD для входящего запроса, поэтому решение будет генерировать pojo из xsd (с использованием cxf), а затем использовать это pojo для сериализации/десериализации xml с помощью XmlMapper. Любое другое лучшее решение? – Sparkle8

+0

Я подозреваю, что определение типа в XSD недостаточно полно, чтобы дать реальные типы? Я не знаю, почему это создаст «Объект». Но без реального типа контента не удастся десериализовать содержимое; сериализация может работать. – StaxMan