【问题标题】:Deserialize XML element with attributes with no value using Jackson Java使用 Jackson Java 反序列化具有没有值的属性的 XML 元素
【发布时间】:2020-04-09 18:00:59
【问题描述】:

我正在尝试反序列化以下 XML,但无法反序列化参数 param 部分。

<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 代码

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

谁能帮我让它工作。谢谢。

【问题讨论】:

    标签: java jackson jackson-databind jackson-dataformat-xml


    【解决方案1】:

    我使用了以下代码,它对我有用,

    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 来自包com.fasterxml.jackson.dataformat.xml.XmlMapper

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

      你需要使用:

      @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));
      

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

      【讨论】:

        猜你喜欢
        • 2019-07-02
        • 2012-12-24
        • 2012-05-09
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多