Java 为什么我可以将xml文件中的反序列化类的标记与Jackson完全拼错?
我正在使用Jackson反序列化xml文件: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
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>