XML 与 JSON 解析教程


前言

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).

特性:

  1. xml具有平台无关性,是一门独立的标记语言。
  2. xml具有自我描述性。

1.2 为什么要学习 XML?

  1. 网络数据传输
  2. 数据存储
  3. 配置文件

但现在我们主要使用 XML 的第三个功能;利用 XML 来作为 SSM 等框架的配置文件。

1.3 XML 文件

.XML 文件是保存 XML 数据的一种方式

XML 数据也可以以其他的方式存在(如在内存中构建 XML 数据)。

不要将 XML 语言狭义的理解成 XML 文件。

1.4 XML 语法格式

  1. XML 文档声明
	<?xml version="1.0" encoding="UTF-8">
		
  1. 标记(元素/标签/节点)

XML 文档,由一个个的标记组成。

语法:

开始标记(开放标记):<标记名称>
结束标记(闭合标记):</标记名称>

标记名称:自定义名称,必须遵循以下命名规则:

1.名称可以含字母、数字以及其他的字符;
2.名称不能以数字或者标点符号开始;
3.名称不能以字符“xml”(或者XML、xml)开始;
4.名称不能包含空格,不能包含冒号(:);
5.名称区分大小写
	标记内容:开始标记与结束标记之间,是标记的内容。

例如,通过标记,描述一本书名:

<name>三国志</name>
  1. 一个 XML 文档中,必须有且仅允许有一个根标记。
正例:
	<names>
		<name>张三</name>
		<name>李四</name>
	</name>
反例:
	<name>李四</name>
	<name>张三</name>
  1. 标记可以嵌套,但是不允许交叉。
正例:
	<person>
		<name>李四</name>
		<age>18</age>
	</person>
反例:
	<person>
		<name>李四<age></name>
		18</age>
	</person>
  1. 标记的层级称呼(子标记,父标记,兄弟标记,后代标记,祖先标记)
例如:
	<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 字符串的步骤:

  1. 引入 JAR 包
  2. 在需要转换 JSON 字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);

案例:

Book b = BookDao.find();
String json = new Gson().toJson(b);
System.out.println(json);
  • 将 JSON 字符串转换为对象

步骤:

  1. 引入 JAR 包

  2. 在需要转换 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 字符串

步骤:

  1. 引入 JAR 包
  2. 在需要转换 JSON 字符串的位置编写如下代码即可:
String json = Json.toJSONString(要转换的对象);

案例:

	Book b = BookDao.find();
	String json = JSON.toJSONString(b);
	System.out.println(json);
  • 将 JSON 字符串转换为对象

步骤:

  1. 引入 JAR 包
  2. 在需要转换 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 的优点:

  1. 格式统一,符合标准;
  2. 容易与其他系统进行远程交互,数据共享比较方便。

XML 的缺点:

  1. XML 文件庞大,文件格式复杂,传输占带宽;
  2. 服务器端和客户端都需要花费大量代码来解析 XML,导致服务器端和客户端代码变得异常复杂且不易维护;
  3. 客户端不同浏览器之间解析 XML 的方式不一致,需要重复写很多代码;
  4. 服务器和客户端解析 XML 花费较多的资源和时间。

JSON 的优缺点

JSON 的优点:

  1. 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
  2. 易于解析,客户端 JavaScript 可以简单的通过 eval() 进行 JSON 数据的读取;
  3. 支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby 等服务器语言,便于服务器端的解析;
  4. 在 PHP 世界,已经有 PHP-JSON 和 JSON-PHP 出现了,偏于 PHP 序列化后的程序直接调用,PHP 服务器端的对象、数组等能直接生成 JSON 格式,便于客户端的访问提取;
  5. 因为 JSON 格式能直接为服务器‘端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。

JSON 的缺点:

  1. 没有 XML 格式这么推广的深入人心和广泛使用,没有 XML 那么通用性;
  2. JSON 格式目前在 Web Service 中推广还属于初级阶段。

面试题

你在项目中哪些地方用到了 XML?

答:

XML 的主要作用有两个方面:数据交换和信息配置,在做数据交换时,XML 将数据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再从 XML 文件中还原相关信息进行处理,XML 曾经是异构系统间交换数据的事实标准,但此项功能几乎已经被 JSON(JavaScript Object Notation)取而代之。当然,目前很多软件仍然使用 XML 来存储配置信息,我们在很多项目中通常也会将作为配置信息的硬代码写在 XML 文件中,Java 的很多框架也是这么做的,而且这些框架都选择了 dom4j 作为处理 XML 的工具,因为 Sun 公司的官方 API 实在不怎么好用。

补充:

现在又很多时髦的软件(如 Sublime) 已经开始将配置文件书写成 JSON 格式,我们已经强烈的感受到 XML 的另一项功能也将逐渐被业界抛弃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值