Десериализовать элемент XML с атрибутами без значения, используя Jackson Java - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь десериализовать следующее XML и не могу десериализовать секцию параметров.

<video src="https://google.com/sample.mp4">
    <param>s</param>
    <param>Y</param>
    <param>Z</param>
</video>

Моя модель

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

import java.util.ArrayList;
import java.util.List;

public class Video {
    @JacksonXmlProperty(isAttribute = true)
    private String src;

    @JacksonXmlElementWrapper(localName = "param", useWrapping = false)
    private List<String> param = new ArrayList<>();

    public String getSrc() {
        return src;
    }

    public List<String> getParam() {
        return param;
    }

    public void setParam(List<String> param) {
        this.param = param;
    }
}

Вывод

{
    "src": "https://google.com/sample.mp4",
    "param": [
        "Z"
    ]
}

Я ожидаю, что значения param будут примерно такими:

{
    "src": "https://google.com/sample.mp4",
    "param": [
        "s",
        "Y",
        "Z"
    ]
}

Java code

ObjectMapper mapper = new ObjectMapper(new XmlFactory());
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
Video video = mapper.readValue(s, Video.class);
System.out.println(new ObjectMapper(new JsonFactory()).writeValueAsString(video));

Может кто-нибудь помочь мне заставить его работать. Спасибо.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вам нужно использовать:

@JacksonXmlProperty(localName = "param")
@JacksonXmlElementWrapper(useWrapping = false)
private List<String> param = new ArrayList<>();

и удалить mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);, поскольку это только маскирует проблему.

Этот код работал для меня:

XmlMapper mapper = new XmlMapper();
Video video = mapper.readValue(s, Video.class);
System.out.println(new ObjectMapper(new JsonFactory()).writeValueAsString(video));

Выходы: {"sr c": "https://google.com/sample.mp4", "param": ["s", "Y", "Z"]}

1 голос
/ 09 апреля 2020

Я использовал следующий код, и он работал для меня,

XmlMapper mapper = new XmlMapper();
    mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
    Video video = mapper.readValue(s, Video.class);
    System.out.println(new ObjectMapper(new JsonFactory()).writeValueAsString(video));

XmlMapper - это пакет frorm com.fasterxml.jackson.dataformat.xml.XmlMapper

Надеюсь, он вам помог.

...