Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我可以将xml文件中的反序列化类的标记与Jackson完全拼错?_Java_Jackson_Deserialization - Fatal编程技术网

Java 为什么我可以将xml文件中的反序列化类的标记与Jackson完全拼错?

Java 为什么我可以将xml文件中的反序列化类的标记与Jackson完全拼错?,java,jackson,deserialization,Java,Jackson,Deserialization,我正在使用Jackson反序列化xml文件: public SomeClassDTO deserializeXML(String pathToFile) { File file = new File(pathToFile); XmlMapper xmlMapper = new XmlMapper(); String xml = null; try { xml = inputStreamToString(new FileInputStream(fil

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

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

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

sldjfks
花言巧语
正如你所看到的,如果我写“Book”或“Booksdhfsj”之类的东西,这是完全没有必要的。
这个事实真的让我很困惑。

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

您可以在此GitHub问题中看到相关对话:

简而言之,用于配置用于
Book
的标记名的任何注释都只用于序列化


如果您只想阅读
书籍
s,一个选项是创建一个类
书籍
,该类将书籍列表读取为。

据我所知,有一个名为“未知属性反序列化失败”的配置/属性或者类似的东西,默认情况下为false,这意味着如果在反序列化过程中遇到无法映射的属性(如Boosdfsk),它将忽略这些属性,而不是出现错误。因此,反序列化的结果应该与删除错误的
标记的结果相同。如果找到代码段
xmlMapper.configure(UNKNOWN\u属性上的反序列化功能.FAIL\u,true)不幸的是,它仍然无法工作。
<SomeClassDTO>
<books>
    <Boosdfsk>
        <name>sldjfks</name>
    </Boosdfsk>
    <Book>
        <name>blablub</name>
    </Book>
</books>
</SomeClassDTO>