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)
可扩展标记语言(extensible Markup Language).
特性:
但现在我们主要使用 XML 的第三个功能;利用 XML 来作为 SSM 等框架的配置文件。
.XML 文件是保存 XML 数据的一种方式
XML 数据也可以以其他的方式存在(如在内存中构建 XML 数据)。
不要将 XML 语言狭义的理解成 XML 文件。
<?xml version="1.0" encoding="UTF-8">
XML 文档,由一个个的标记组成。
语法:
开始标记(开放标记):<标记名称>
结束标记(闭合标记):标记名称>
标记名称:自定义名称,必须遵循以下命名规则:
1.名称可以含字母、数字以及其他的字符;
2.名称不能以数字或者标点符号开始;
3.名称不能以字符“xml”(或者XML、xml)开始;
4.名称不能包含空格,不能包含冒号(:);
5.名称区分大小写
标记内容:开始标记与结束标记之间,是标记的内容。
例如,通过标记,描述一本书名:
<name>三国志name>
正例:
<names>
<name>张三name>
<name>李四name>
name>
反例:
<name>李四name>
<name>张三name>
正例:
<person>
<name>李四name>
<age>18age>
person>
反例:
<person>
<name>李四<age>name>
18age>
person>
例如:
<persons>
<person>
<name>李四name>
<length>180cmlength>
person>
<person>
<name>李四name>
<length>200cmlength>
person>
<persons>
name 是 person 的子标记,也是 person 的后代标记。
name 是 persons 的后代标记。
name 是 length 的兄弟标记。
person 是 name 的父标记。
persons 是 name 的祖先标记。
JSON:JavaScript Object Notation JS 对象简谱,是一种轻量级的数据交换格式。
例如:
一本书
书名
简介
不同语言的描述:
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 中的任意类型的数据。
在 JSON 格式中可以与对象互相嵌套
[元素1,元素2…]
案例:
{
"name":"张三",
"age":18,
"pengyou":["李四","王五","曹操",{"name":"大朗","info":"大朗该喝药了"}]
"heihei":{
"name":"小老弟",
"length":"40cm"
}
}
Q:它们能做什么?
A:
将 Java 中的对象,快速的转换为 JSON 格式的字符串。
将 JSON 格式的字符串,转换为 Java 的对象。
转换 JSON 字符串的步骤:
String json = new Gson().toJSON(要转换的对象);
案例:
Book b = BookDao.find();
String json = new Gson().toJson(b);
System.out.println(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)
步骤:
String json = Json.toJSONString(要转换的对象);
案例:
Book b = BookDao.find();
String json = JSON.toJSONString(b);
System.out.println(json);
步骤:
类型 对象名 = 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 的缺点:
JSON 的优点:
JSON 的缺点:
答:
XML 的主要作用有两个方面:数据交换和信息配置,在做数据交换时,XML 将数据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再从 XML 文件中还原相关信息进行处理,XML 曾经是异构系统间交换数据的事实标准,但此项功能几乎已经被 JSON(JavaScript Object Notation)取而代之。当然,目前很多软件仍然使用 XML 来存储配置信息,我们在很多项目中通常也会将作为配置信息的硬代码写在 XML 文件中,Java 的很多框架也是这么做的,而且这些框架都选择了 dom4j 作为处理 XML 的工具,因为 Sun 公司的官方 API 实在不怎么好用。
补充:
现在又很多时髦的软件(如 Sublime) 已经开始将配置文件书写成 JSON 格式,我们已经强烈的感受到 XML 的另一项功能也将逐渐被业界抛弃。