java - 为什么我可以用 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”之类的,完全没有必要。这个事实真的让我很困惑。
解决方案
因为杰克逊通过检查属性有足够的关于反序列化类型的信息books
,所以它不需要知道关于每个子对象使用的标签的任何信息。它知道每个子元素都是一个Book
.
您可以在此 GitHub 问题中看到相关对话: https ://github.com/FasterXML/jackson-dataformat-xml/issues/322
简而言之,您用于配置标签名称的任何注释Book
都只会用于序列化。
推荐阅读
- button - 使用绑定隐藏非选定 cellView 中的按钮
- arduino - Arduino led 矩阵 max7219 MCU 板点阵
- c# - .editorconfig 用于测试项目/类
- javascript - 使用正则表达式替换电子邮件字符串中倒数第二个字符(点)
- javascript - Javascript 中的分号怪异行为(如果我不放分号代码不起作用)
- django - Django DRF 不返回图像字段 url
- docker - 如何为 postgresql 创建 digitalocean 防火墙
- vb.net - VB.netSystem.TimeZoneInfo.ConvertTimeFromUtc 不适用于某个时区(UTC -1:00 亚速尔群岛)
- javascript - Node JS SSE:共享订阅时忽略 RxJs 可观察到的错误
- android - 当用户触摸屏幕时,AccessibilityService 调度的手势停止