Java笔记16-XML与JSON

目录

  • XML简介
  • 使用DOM
  • 使用SAX
  • 使用Jackson
  • 使用JSON

XML和JSON是两种经常在网络使用的数据表示格式。
笔记摘自 廖雪峰的官方网站-Java教程-XML与JSON 。

XML简介

XML是可扩展标记语言(eXtensible Markup Language)的缩写,它是是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。

XML有几个特点:

  • 纯文本,默认使用UTF-8编码;
  • 可嵌套,适合表示结构化数据。

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>

由于使用了<、>以及引号等标识符,如果内容出现了特殊符号,需要转义。

常见的特殊字符以及其转义如下:
Java笔记16-XML与JSON_第1张图片
格式正确的XML(Well Formed)是指XML的格式是正确的,可以被解析器正常读取。通过浏览器可以验证XML文件准确性。

而合法的XML是指,不但XML格式正确,而且它的数据结构可以被DTD或者XSD验证。

因为XML是一种树形结构的文档,它有两种标准的解析API:

  • DOM:一次性读取XML,并在内存中表示为树形结构;
  • SAX:以流的形式读取XML,使用事件回调。

使用DOM

Java提供的DOM API可以将XML解析为DOM结构,以Document对象表示;

DOM可在内存中完整表示XML数据结构;

DOM解析速度慢,内存占用大。

理解不难,详情见 使用DOM 。

使用SAX

SAX是一种流式解析XML的API;

SAX通过事件触发,读取速度快,消耗内存少;

调用方必须通过回调方法获得解析过程中的数据。

详情见 使用SAX 。

使用Jackson

无论是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的依赖:

  • com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.10.1
  • org.codehaus.woodstox:woodstox-core-asl:4.4.1

然后,定义好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 官方文档 。

使用JSON

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只允许使用UTF-8编码,不存在编码问题;
  • JSON只允许使用双引号作为key,特殊字符用\转义,格式简单;
  • 浏览器内置JSON支持,如果把数据用JSON发送给浏览器,可以用JavaScript直接处理。

因此,JSON适合表示层次结构,因为它格式简单,仅支持以下几种数据类型:

  • 键值对:{“key”: value}
  • 数组:[1, 2, 3]
  • 字符串:“abc”
  • 数值(整数和浮点数):12.34
  • 布尔值:true或false
  • 空值:null

使用Java对JSON进行读写
Java用于解析json的第三方库Jackson可以实现JavaBean和JSON之间的转换,只需要引入以下Maven依赖:

  • com.fasterxml.jackson.core:jackson-databind:2.10.0

可以通过Module扩展Jackson能处理的数据类型;

可以自定义JsonSerializer和JsonDeserializer来定制序列化和反序列化。

详情见 XML与JSON 。

你可能感兴趣的:(java)