目录
前言
XML 和 JSON 是现今互联网中最常用的两种数据交换格式。XML 格式由 W3C 于 1996 年提出。JSON 格式由 Douglas Crockford 于 2002 年提出。虽然这两种格式的设计目标并不相同,但它们常常用于同一个任务,也就是数据交换中。XML 和 JSON 的文档都很完善(RFC 7159、RFC 4825),且都同时具有 人类可读性(human-readable)和 机器可读性(machine-readable)。这两种格式并没有哪一个比另一个更强,只是各自适用的领域不用。(LCTT 译注:W3C 是互联网联盟,制定了各种 Web 相关的标准,如 HTML、CSS 等。Douglas Crockford 除了制定了 JSON 格式,还致力于改进 JavaScript,开发了 JavaScript 相关工具 JSLint 和 JSMin)
一、XML 是什么?
1.1 简介
可扩展标记语言(extensible Markup Language).
特性:
- xml具有平台无关性,是一门独立的标记语言。
- xml具有自我描述性。
1.2 为什么要学习 XML?
- 网络数据传输
- 数据存储
- 配置文件
但现在我们主要使用 XML 的第三个功能;利用 XML 来作为 SSM 等框架的配置文件。
1.3 XML 文件
.XML 文件是保存 XML 数据的一种方式
XML 数据也可以以其他的方式存在(如在内存中构建 XML 数据)。
不要将 XML 语言狭义的理解成 XML 文件。
1.4 XML 语法格式
- XML 文档声明
<?xml version="1.0" encoding="UTF-8">
- 标记(元素/标签/节点)
XML 文档,由一个个的标记组成。
语法:
开始标记(开放标记):<标记名称>
结束标记(闭合标记):</标记名称>
标记名称:自定义名称,必须遵循以下命名规则:
1.名称可以含字母、数字以及其他的字符;
2.名称不能以数字或者标点符号开始;
3.名称不能以字符“xml”(或者XML、xml)开始;
4.名称不能包含空格,不能包含冒号(:);
5.名称区分大小写
标记内容:开始标记与结束标记之间,是标记的内容。
例如,通过标记,描述一本书名:
<name>三国志</name>
- 一个 XML 文档中,必须有且仅允许有一个根标记。
正例:
<names>
<name>张三</name>
<name>李四</name>
</name>
反例:
<name>李四</name>
<name>张三</name>
- 标记可以嵌套,但是不允许交叉。
正例:
<person>
<name>李四</name>
<age>18</age>
</person>
反例:
<person>
<name>李四<age></name>
18</age>
</person>
- 标记的层级称呼(子标记,父标记,兄弟标记,后代标记,祖先标记)
例如:
<persons>
<person>
<name>李四</name>
<length>180cm</length>
</person>
<person>
<name>李四</name>
<length>200cm</length>
</person>
<persons>
name 是 person 的子标记,也是 person 的后代标记。
name 是 persons 的后代标记。
name 是 length 的兄弟标记。
person 是 name 的父标记。
persons 是 name 的祖先标记。
二、JSON
2.1 简介
JSON:JavaScript Object Notation JS 对象简谱,是一种轻量级的数据交换格式。
2.2 对象格式
例如:
一本书
书名
简介
不同语言的描述:
Java:
class Book{
private String name;
private String info;
get/set...
}
Book b = new Book();
b.setName("三国志");
b.setInfo("战争谋略");
...
JS:
var b = new Object();
b.name = "三国志";
b.info = "战争谋略"
XML:
<book>
<name>三国志</name>
<info>战争谋略</info>
</book>
JSON:
{
"name":"三国志",
"info":"战争谋略"
}
一个对象,由一个大括号表示,括号中描述对象的属性,通过键值对来描述对象的属性
(可以理解为,大括号中,包含的是一个个的键值对。)
格式:
键与值之间使用冒号连接,多个键值对之间使用逗号分隔。
键值对的键 应使用引号引住(通常 Java解析时,键不使用引号会报错,而 JS 能正确解析。)
键值对的值,可以是 JS 中的任意类型的数据。
2.3 数组格式
在 JSON 格式中可以与对象互相嵌套
[元素1,元素2…]
案例:
{
"name":"张三",
"age":18,
"pengyou":["李四","王五","曹操",{"name":"大朗","info":"大朗该喝药了"}]
"heihei":{
"name":"小老弟",
"length":"40cm"
}
}
2.4 Java 与 JSON
Q:它们能做什么?
A:
将 Java 中的对象,快速的转换为 JSON 格式的字符串。
将 JSON 格式的字符串,转换为 Java 的对象。
2.5 Gson
- 将对象转换为 JSON 字符串
转换 JSON 字符串的步骤:
- 引入 JAR 包
- 在需要转换 JSON 字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
案例:
Book b = BookDao.find();
String json = new Gson().toJson(b);
System.out.println(json);
- 将 JSON 字符串转换为对象
步骤:
-
引入 JAR 包
-
在需要转换 Java 对象的位置,编写如下代码:
对象 = new Gson().formJson(Json 字符串,对象类型.class);
案例:
String json = "{\"id\":1,\"name\":\"金瓶梅"\",\"author\":\"武大郎\",\"info":\"嘿嘿嘿\",\"price\":198.0}";
Book book = new Gson().format(json, Book.class);
System.out.println(book)
2.6 FastJson(阿里开源的一个高性能的 JSON 框架)
- 将对象转换为 JSON 字符串
步骤:
- 引入 JAR 包
- 在需要转换 JSON 字符串的位置编写如下代码即可:
String json = Json.toJSONString(要转换的对象);
案例:
Book b = BookDao.find();
String json = JSON.toJSONString(b);
System.out.println(json);
- 将 JSON 字符串转换为对象
步骤:
- 引入 JAR 包
- 在需要转换 Java 对象的位置,编写如下代码:
类型 对象名 = JSON.parseObject(JSON字符串, 类型.class);
或者
List<类型> list = JSON.parseArray(JSON字符串,类型.class);
案例:
String json = "{\"id\":1,\"name\":\"金瓶梅"\",\"author\":\"武大郎\",\"info":\"嘿嘿嘿\",\"price\":198.0}";
Book book = JSON.parseObject(json, Book.class);
System.out.println(book);
总结
XML 的优缺点
XML 的优点:
- 格式统一,符合标准;
- 容易与其他系统进行远程交互,数据共享比较方便。
XML 的缺点:
- XML 文件庞大,文件格式复杂,传输占带宽;
- 服务器端和客户端都需要花费大量代码来解析 XML,导致服务器端和客户端代码变得异常复杂且不易维护;
- 客户端不同浏览器之间解析 XML 的方式不一致,需要重复写很多代码;
- 服务器和客户端解析 XML 花费较多的资源和时间。
JSON 的优缺点
JSON 的优点:
- 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
- 易于解析,客户端 JavaScript 可以简单的通过 eval() 进行 JSON 数据的读取;
- 支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby 等服务器语言,便于服务器端的解析;
- 在 PHP 世界,已经有 PHP-JSON 和 JSON-PHP 出现了,偏于 PHP 序列化后的程序直接调用,PHP 服务器端的对象、数组等能直接生成 JSON 格式,便于客户端的访问提取;
- 因为 JSON 格式能直接为服务器‘端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
JSON 的缺点:
- 没有 XML 格式这么推广的深入人心和广泛使用,没有 XML 那么通用性;
- JSON 格式目前在 Web Service 中推广还属于初级阶段。
面试题
你在项目中哪些地方用到了 XML?
答:
XML 的主要作用有两个方面:数据交换和信息配置,在做数据交换时,XML 将数据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再从 XML 文件中还原相关信息进行处理,XML 曾经是异构系统间交换数据的事实标准,但此项功能几乎已经被 JSON(JavaScript Object Notation)取而代之。当然,目前很多软件仍然使用 XML 来存储配置信息,我们在很多项目中通常也会将作为配置信息的硬代码写在 XML 文件中,Java 的很多框架也是这么做的,而且这些框架都选择了 dom4j 作为处理 XML 的工具,因为 Sun 公司的官方 API 实在不怎么好用。
补充:
现在又很多时髦的软件(如 Sublime) 已经开始将配置文件书写成 JSON 格式,我们已经强烈的感受到 XML 的另一项功能也将逐渐被业界抛弃。