使用重复的嵌套标签对杰克逊进行反序列化xml

问题描述 投票:0回答:2

我正在尝试反序列化具有相同名称的嵌套属性的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>变量。

java xml jackson xml-serialization
2个回答
0
投票

我设法使它创建一个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而不是ArrayList


0
投票

对于版本2.9.9,简单的POJOJacksonXmlElementWrapper注释按预期工作:

class Response {

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

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

    // getters, setters
}
© www.soinside.com 2019 - 2024. All rights reserved.