Полный список элементов не появляется после десериализации XML String в объект с помощью Jackson XML mapper

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

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;
    }

}

Хотя в ItemList есть 3 элемента во входной XML-строке, объект результата содержит только 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"
          }
        }
      }
    }
  }
}

1 ответ

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

Другие вопросы по тегам