Десериализация XML с дубликатами вложенных тегов с Джексоном - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь десериализовать некоторый xml с вложенными свойствами с тем же именем, но имя оболочки уникально для каждого свойства. Пример XML ниже.

Я попытался поиграть с переключением имен оболочки и свойств, но, похоже, не работает.

<response>
    <string>
        <item>Sample string.</item>
        <item>Another sample string.</item>
    </string>
    <number>
        <item>123123123</item>
        <item>900912</item>
    </number>
</response>

Я пытаюсь десериализовать приведенный выше XML в List<String> и List<Integer> переменная.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Для версии 2.9.9, простой POJO с JacksonXmlElementWrapper, аннотация работает, как и ожидалось:

class Response {

    @JacksonXmlElementWrapper(localName = "string")
    private List<String> strings;

    @JacksonXmlElementWrapper(localName = "number")
    private List<Integer> numbers;

    // getters, setters
}
1 голос
/ 30 сентября 2019

Мне удалось создать пару или оболочки ArrayLists в качестве внутренних классов:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

@JacksonXmlRootElement(localName="response")
public class ResponseObjectList implements Serializable {

    @JacksonXmlProperty(localName = "string")
    private StringArrayListContainer string;

    @JacksonXmlProperty(localName = "number")
    private IntegerArrayListContainer number;

    public ResponseObjectList() {
        super();
    }

    public ResponseObjectList(List<String> stringItems, List<Integer> intItems) {
        super();
        this.string = new StringArrayListContainer(stringItems);
        this.number = new IntegerArrayListContainer(intItems);
    }

    public StringArrayListContainer getString() {
        return string;
    }

    public void setString(StringArrayListContainer string) {
        this.string = string;
    }

    public IntegerArrayListContainer getNumber() {
        return number;
    }

    public void setNumber(IntegerArrayListContainer number) {
        this.number = number;
    }

    public static class StringArrayListContainer extends ArrayListContainer<String>{

        public StringArrayListContainer() {
            super();
        }

        public StringArrayListContainer(List<String> item) {
            super(item);
        }

    }

    public static class IntegerArrayListContainer extends ArrayListContainer<Integer>{

        public IntegerArrayListContainer() {
            super();
        }

        public IntegerArrayListContainer(List<Integer> item) {
            super(item);
        }

    }

    public static class ArrayListContainer<T extends Serializable>{ 

        @JacksonXmlElementWrapper(useWrapping=false)
        @JacksonXmlProperty(localName="item")
        private List<T> item;

        public ArrayListContainer(List<T> item) {
            super();
            this.item = item;
        }

        public ArrayListContainer() {
            super();
        }

        public List<T> getItem() {
            return item;
        }

        public void setItem(List<T> item) {
            this.item = item;
        }

    }

}

Тесты выглядели хорошо:

@Test
    public void test3() throws JsonProcessingException {
        ResponseObjectList response = new ResponseObjectList(
                    Arrays.asList(new String[] {"Sample string.","Another sample string"}),
                    Arrays.asList(new Integer[] {123123123,900912})
                );
        XmlMapper xmlMapper = new XmlMapper();
        String content = xmlMapper.writeValueAsString(response);
        this.logger.debug("content: " + content);
        // content: <response xmlns=""><string><item>Sample string.</item><item>Another sample string</item></string><number><item>123123123</item><item>900912</item></number></response>
    }

    @Test
    public void test4() throws JsonParseException, JsonMappingException, IOException {
        String xml = 
                "<response>"
                + "<string>"
                + "<item>Sample string.</item>"
                + "<item>Another sample string</item>"
                + "</string>"
                + "<number>"
                + "<item>123123123</item>"
                + "<item>900912</item>"
                + "</number>"
                + "</response>";

        XmlMapper xmlMapper = new XmlMapper();
        ResponseObjectList object = xmlMapper.readValue(xml, ResponseObjectList.class);
        Assert.assertFalse(object.getString().getItem().isEmpty());
        Assert.assertFalse(object.getNumber().getItem().isEmpty());
    }

Я использовал List s вместо ArrayList s как для упаковщиков, так и для тестов

...