使用Jackson


前面我们介绍了DOM和SAX两种解析XML的标准接口。但是,无论是DOM还是SAX,使用起来都不直观。

观察XML文档的结构:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <book id="1">
  3. <name>Java核心技术</name>
  4. <author>Cay S. Horstmann</author>
  5. <isbn lang="CN">1234567</isbn>
  6. <tags>
  7. <tag>Java</tag>
  8. <tag>Network</tag>
  9. </tags>
  10. <pubDate/>
  11. </book>

我们发现,它完全可以对应到一个定义好的JavaBean中:

  1. public class Book {
  2. public long id;
  3. public String name;
  4. public String author;
  5. public String isbn;
  6. public List<String> tags;
  7. public String pubDate;
  8. }

如果能直接从XML文档解析成一个JavaBean,那比DOM或者SAX不知道容易到哪里去了。

幸运的是,一个名叫Jackson的开源的第三方库可以轻松做到XML到JavaBean的转换。我们要使用Jackson,先添加一个Maven的依赖:

  • com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.10.1

然后,定义好JavaBean,就可以用下面几行代码解析:

  1. InputStream input = Main.class.getResourceAsStream("/book.xml");
  2. JacksonXmlModule module = new JacksonXmlModule();
  3. XmlMapper mapper = new XmlMapper(module);
  4. Book book = mapper.readValue(input, Book.class);
  5. System.out.println(book.id);
  6. System.out.println(book.name);
  7. System.out.println(book.author);
  8. System.out.println(book.isbn);
  9. System.out.println(book.tags);
  10. System.out.println(book.pubDate);

注意到XmlMapper就是我们需要创建的核心对象,可以用readValue(InputStream, Class)直接读取XML并返回一个JavaBean。运行上述代码,就可以直接从Book对象中拿到数据:

  1. 1
  2. Java核心技术
  3. Cay S. Horstmann
  4. 1234567
  5. [Java, Network]
  6. null

如果要解析的数据格式不是Jackson内置的标准格式,那么需要编写一点额外的扩展来告诉Jackson如何自定义解析。这里我们不做深入讨论,可以参考Jackson的官方文档

练习

使用Jackson - 图1下载练习:使用Jackson解析XML (推荐使用IDE练习插件快速下载)

小结

使用Jackson解析XML,可以直接把XML解析为JavaBean,十分方便。

读后有收获可以支付宝请作者喝咖啡:

使用Jackson - 图2