Десериализация XML в список с помощью Джексона не удалась - PullRequest
2 голосов
/ 11 мая 2019

Я пытаюсь десериализовать свой XML-файл и сопоставить его с моим классом, он работает нормально, если я не прикрепил List к своему классу.

Я уже добавил статический класс 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"])

Ответы [ 2 ]

2 голосов
/ 11 мая 2019

Я не уверен в вашей версии библиотеки Джексона, но если вы используете версию 2.1 или новее, можете ли вы попробовать этот код ниже? Кроме того, кажется нехорошо смешивать codehaus и fasterxml.

попробуйте следующее:

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 к аннотации JacksonXmlElementWrapper, ничего не изменится. Вызовите метод следующим образом:

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);
1 голос
/ 11 мая 2019

Мне удалось разобрать его по

<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с модульным тестом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...