XML和JSON是两种经常在网络使用的数据表示格式。
笔记摘自 廖雪峰的官方网站-Java教程-XML与JSON 。
XML是可扩展标记语言(eXtensible Markup Language)的缩写,它是是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。
XML有几个特点:
XML的结构
XML有固定的结构,首行必定是,可以加上可选的编码。
紧接着,如果以类似声明的是文档定义类型(DTD:Document Type Definition),DTD是可选的。
接下来是XML的文档内容,一个XML文档有且仅有一个根元素,根元素可以包含任意个子元素,元素可以包含属性,例如,1234567包含一个属性lang=“CN”,且元素必须正确嵌套。如果是空元素,可以用表示。
例如,一个描述书籍的XML文档可能如下:
<book id="1">
<name>Java核心技术name>
<author>Cay S. Horstmannauthor>
<isbn lang="CN">1234567isbn>
<tags>
<tag>Javatag>
<tag>Networktag>
tags>
<pubDate/>
book>
由于使用了<、>以及引号等标识符,如果内容出现了特殊符号,需要转义。
常见的特殊字符以及其转义如下:
格式正确的XML(Well Formed)是指XML的格式是正确的,可以被解析器正常读取。通过浏览器可以验证XML文件准确性。
而合法的XML是指,不但XML格式正确,而且它的数据结构可以被DTD或者XSD验证。
因为XML是一种树形结构的文档,它有两种标准的解析API:
Java提供的DOM API可以将XML解析为DOM结构,以Document对象表示;
DOM可在内存中完整表示XML数据结构;
DOM解析速度慢,内存占用大。
理解不难,详情见 使用DOM 。
SAX是一种流式解析XML的API;
SAX通过事件触发,读取速度快,消耗内存少;
调用方必须通过回调方法获得解析过程中的数据。
详情见 使用SAX 。
无论是DOM还是SAX,使用起来都不直观。观察XML文档的结构:
<book id="1">
<name>Java核心技术name>
<author>Cay S. Horstmannauthor>
<isbn lang="CN">1234567isbn>
<tags>
<tag>Javatag>
<tag>Networktag>
tags>
<pubDate/>
book>
其完全可以对应到一个定义好的JavaBean中:
public class Book {
public long id;
public String name;
public String author;
public String isbn;
public List<String> tags;
public String pubDate;
}
Jackson的开源的第三方库可以做到XML到JavaBean的转换。要使用Jackson,先添加两个Maven的依赖:
然后,定义好JavaBean,就可以用下面几行代码解析:
InputStream input = Main.class.getResourceAsStream("/book.xml");
JacksonXmlModule module = new JacksonXmlModule();
XmlMapper mapper = new XmlMapper(module);
Book book = mapper.readValue(input, Book.class);
System.out.println(book.id);
System.out.println(book.name);
System.out.println(book.author);
System.out.println(book.isbn);
System.out.println(book.tags);
System.out.println(book.pubDate);
注意到XmlMapper就是我们需要创建的核心对象,可以用readValue(InputStream, Class)直接读取XML并返回一个JavaBean。运行上述代码,就可以直接从Book对象中拿到数据:
1
Java核心技术
Cay S. Horstmann
1234567
[Java, Network]
null
如果要解析的数据格式不是Jackson内置的标准格式,那么需要编写一点额外的扩展来告诉Jackson如何自定义解析。参考 Jackson 官方文档 。
XML的特点是功能全面,但标签繁琐,格式复杂。在Web上使用XML现在越来越少,取而代之的是JSON这种数据结构。
JSON是JavaScript Object Notation的缩写,它去除了所有JavaScript执行代码,只保留JavaScript的对象格式。JSON是轻量级的数据表示方式,常用于Web应用;一个典型的JSON如下:
{
"id": 1,
"name": "Java核心技术",
"author": {
"firstName": "Abc",
"lastName": "Xyz"
},
"isbn": "1234567",
"tags": ["Java", "Network"]
}
JSON作为数据传输的格式,有几个显著的优点:
因此,JSON适合表示层次结构,因为它格式简单,仅支持以下几种数据类型:
使用Java对JSON进行读写
Java用于解析json的第三方库Jackson可以实现JavaBean和JSON之间的转换,只需要引入以下Maven依赖:
可以通过Module扩展Jackson能处理的数据类型;
可以自定义JsonSerializer和JsonDeserializer来定制序列化和反序列化。
详情见 XML与JSON 。