【问题标题】:Deserialise Xml to List using Jackson failed使用 Jackson 将 Xml 反序列化到列表失败
【发布时间】:2019-09-28 23:02:55
【问题描述】:

我正在尝试反序列化我的 Xml 文件并将其映射到我的类,如果我没有将列表附加到我的类,它工作正常。

我已经添加了静态类,jsonIgnoreProperties,使用 XMLElementWrapper,但它仍然无法正常工作!

这是我调用的方法。

File file = new File(test.xml);
XmlMapper xmlMapper = new XmlMapper();
String xml = inputStreamToString(new FileInputStream(file));

Test test = xmlMapper.readValue(xml, Test.class);

这是我的课。

import java.util.List;
import org.codehaus.jackson.annotate.JsonProperty;
import com.fasterxml.jackson.xml.annotate.JacksonXmlElementWrapper;
import com.fasterxml.jackson.xml.annotate.JacksonXmlRootElement;

@JacksonXmlRootElement(localName = "web-request-form")
public class Test {

@JsonProperty("attachments")
public Attachments attachments;

public Test(Attachments attachments) {
    super();
    this.attachments = attachments;
}

public Test() {
    super();
}

public Attachments getAttachments() {
    return attachments;
}

public void setAttachments(Attachments attachments) {
    this.attachments = attachments;
}

public static class Attachments {


    @JacksonXmlElementWrapper(localName = "attachment")
    public List<Attachment> attachment;

    public Attachments() {
        super();
    }

    public Attachments(List<Attachment> attachment) {
        super();
        this.attachment = attachment;
    }

    public List<Attachment> getAttachment() {
        return attachment;
    }

    public void setAttachment(List<Attachment> attachment) {
        this.attachment = attachment;
    }
}

public static class Attachment {

    @JsonProperty("filename")
    public String fileName;

    @JsonProperty("desc")
    public String desc;

    @JsonProperty("size")
    public String size;

    public Attachment() {
        super();
    }

    public Attachment(String fileName, String desc, String size) {
        super();
        this.fileName = fileName;
        this.desc = desc;
        this.size = size;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }
}

}

这是我的 xml 文件。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--This file was generated from an ASPX file-->
<web-request-form xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="WebRequestForm.elms.xmlbeans.novacitynets.com">
 <attachments>
  <attachment>
    <filename>test</filename>
    <desc />
    <size>2089.801</size>
  </attachment>
 </attachments>
</web-request-form>

这是我遇到的错误。

Can not instantiate value of type [simple type, class 
package.Test$Attachment] from JSON String; no single-String 
constructor/factory method (through reference chain: 
package.Test["attachments"]->package.Attachments["attachment"])

【问题讨论】:

  • 如果从Attachment 中删除多参数构造函数会发生什么?

标签: java xml list class jackson


【解决方案1】:

我不确定您的 Jackson 库版本,但如果您使用的是 2.1 或更高版本,您可以试试下面的代码吗? 另外,codehausfasterxml 混用似乎不太好。

尝试以下方法:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

import java.util.List;

@JacksonXmlRootElement(localName = "web-request-form")
public class Test {
    @JsonProperty("attachments")
    public Attachments attachments;

    public static class Attachments {
        // @JacksonXmlElementWrapper(localName = "attachment")
        @JacksonXmlElementWrapper(useWrapping = false, localName = "attachment")
        public List<Attachment> attachment;

        // ...
    }

    public static class Attachment {
        @JsonProperty("filename")
        public String fileName;

        @JsonProperty("desc")
        public String desc;

        @JsonProperty("size")
        public String size;

        // ...
    }
}

如果您已将useWrapping 选项应用于JacksonXmlElementWrapperannotation,则不会发生任何变化。调用方法如下:

File file = new File("test.xml");

// If you use the useWrapping option globally
// JacksonXmlModule module = new JacksonXmlModule();
// module.setDefaultUseWrapper(false);

XmlMapper xmlMapper = new XmlMapper(module);
String xml = inputStreamToString(new FileInputStream(file));
Test test = xmlMapper.readValue(xml, Test.class);

【讨论】:

  • 谢谢!!你没有混合 codehaus 和 fastxml 是对的。使用了另一个 Jackson 库并在上面进行了更改,它运行良好..
【解决方案2】:

我已经设法通过

解析它
<dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-xml</artifactId>
  <version>2.9.8</version>
</dependency>

实体:

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

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

@JacksonXmlRootElement(localName = "web-request-form")
public class WebRequestForm {

    public Attachments attachments;

    public static class Attachments {

        @JacksonXmlElementWrapper(useWrapping = false)
        public List<Attachment> attachment = new ArrayList<>();

    }

    public static class Attachment {

        @JacksonXmlProperty(localName = "filename")
        public String fileName;

        public String desc;

        public String size;

    }
}

解析器:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.IOException;

    public class WebRequestFormParser {

        public WebRequestForm parse(String sampleXMLContent) throws IOException {
            XmlMapper xmlMapper = new XmlMapper();
            WebRequestForm result = xmlMapper.readValue(sampleXMLContent, WebRequestForm.class);
            return result;
        }
    }

请看项目https://github.com/sbzDev/stackoverflow/tree/master/question56087719 带单元测试

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2018-12-26
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多