首页 > 解决方案 > 为什么我可以用 Jackson 将 xml 文件中的反序列化类的标签完全拼错?

问题描述

我正在使用 Jackson 反序列化一个 xml 文件:

public SomeClassDTO deserializeXML(String pathToFile) {
    File file = new File(pathToFile);
    XmlMapper xmlMapper = new XmlMapper();
    String xml = null;
    try {
        xml = inputStreamToString(new FileInputStream(file));
        xml = xml.replaceAll("\\s+","");
    } catch (FileNotFoundException fileNotFoundException) {
        logger.error("file could not be found");
    }
    SomeClassDTO value = new SomeClassDTO();
    try {
        value = xmlMapper.readValue(xml, SomeClassDTO.class);
    } catch (JsonProcessingException jsonProcessingException) {
        logger.error("Deserialization failed");
        jsonProcessingException.printStackTrace();
    }
    return value;
}

public String inputStreamToString(InputStream is) {
    StringBuilder sb = new StringBuilder();
    String line;

    try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
    } catch (IOException ioException) {
        logger.error("Die Konfigurationsdatei kann nicht gelesen werden.");
        ioException.printStackTrace();
    }
    return sb.toString();
}

此外,SomeClassDTO 如下所示:

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

public class SomeClassDTO {
    private List<Book> books = new ArrayList<>();

    public List<Book> getBooks() {
        return books;
    }

    public void setBooks(List<Book> books) {
        this.books = books;
    }
}

这就是 Book 类的样子:

class Book {
private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

这是我尝试读取的 xml 文件:

<SomeClassDTO>
<books>
    <Boosdfsk>
        <name>sldjfks</name>
    </Boosdfsk>
    <Book>
        <name>blablub</name>
    </Book>
</books>
</SomeClassDTO>

如您所见,如果我写“Book”或“Booksdhfsj”之类的,完全没有必要。这个事实真的让我很困惑。

标签: javajacksondeserialization

解决方案


因为杰克逊通过检查属性有足够的关于反序列化类型的信息books,所以它不需要知道关于每个子对象使用的标签的任何信息。它知道每个子元素都是一个Book.

您可以在此 GitHub 问题中看到相关对话: https ://github.com/FasterXML/jackson-dataformat-xml/issues/322

简而言之,您用于配置标签名称的任何注释Book都只会用于序列化。

如果您只想阅读s,一种选择是创建一个类该类将书籍列表作为未包装的列表读取。BookBooks


推荐阅读