为什么我可以用 Jackson 完全拼错 xml 文件中反序列化 类 的标签?

Why can I totally misspell the tags of the deserialization classes in xml file with Jackson?

我正在使用 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;
    }
}

这本书 class 的样子:

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”之类的完全没有必要。 这个事实真的让我很困惑。

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

您可以在本期 GitHub 中查看相关对话: https://github.com/FasterXML/jackson-dataformat-xml/issues/322

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

如果您只想读取Books,一个选择是创建一个classBooks来读取列表作为 unwrapped list.

的书籍