为什么我可以用 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
的标签名称的任何注释将仅用于序列化。
如果您只想读取Book
s,一个选择是创建一个classBooks
来读取列表作为 unwrapped list.
的书籍
我正在使用 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
的标签名称的任何注释将仅用于序列化。
如果您只想读取Book
s,一个选择是创建一个classBooks
来读取列表作为 unwrapped list.