现在,JSON 为 Web 应用程序开发人员提供了另一种数据交换格式。 让我们看一下什么是 JSON,它比 XML 或 HTML 片段提供了更大的简单性和灵活性。
Ajax 资源中心
访问 Ajax 资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括文档、教程、论坛、博客、wiki 和新闻。 有关 Ajax 的任何新信息都可以在这里找到。
JSON数据格式解析
与 XML 一样,JSON 是一种基于纯文本的数据格式。 由于JSON被设计为只读,因此JSON的数据格式非常简单。 你可以使用JSON来传输一个简单的,,,也可以传输一个数组,或者一个复杂的对象。
、 和 用 JSON 表示非常简单。 例如,用 JSON 表示的简单“ abc ”具有以下格式:
“abc”
除了字符“,,/和一些控制字符(,f,,,)需要编码外,其他字符都可以直接输出。下图是完整的表示结构:
图 1. 完整的表示结构
一个可以表示为整数或浮点数,如下所示:
图 2. 的表示结构
这与大多数编程语言的表示方法是一致的,例如:
12345(整数)
-3.9e10(浮点数)
类型表示为 true 或 false。 另外,null in 表示为null。 注意 true、false 和 null 不能使用双引号,否则将被视为 1。
JSON还可以表示一个数组对象,使用[]包含所有元素,每个元素用逗号分隔,元素可以是任意Value。 例如,以下数组包含 a, 和 null:
[“abc”,12345,假,空]
对象在 JSON 中由包含一系列无序键值对的 {} 表示。 其实这相当于Java中的Map,而不是Java中的Class。 请注意,Key 只能用 表示。
例如,一个对象包含以下Key-Value:
城市:
: 路
: (整数)
用JSON表示如下:
{"城市":"","":"道路","":}
值也可以是另一个对象或数组,因此可以嵌套复杂的表示。 例如,一个包含name和的对象可以表示如下:
{“姓名”:””,””:
{"城市":"","":"道路","":}
处理 JSON 数据
上面介绍了如何使用JSON来表示数据。 接下来我们要解决服务器端如何生成JSON格式数据发送给客户端,以及客户端如何使用和处理JSON格式数据。
我们首先讨论如何处理网页中的JSON数据。 我们可以通过一个简单的方法来看看客户端是如何向用户表示JSON数据的:
() {
var j={"名称":"","":
{"城市":"","":"道路","":}
};
.write(j.name);
.write(j..city);
假设服务器返回的JSON数据如上:
{“姓名”:””,””:
{"城市":"","":"道路","":}
只需将其分配给一个变量,您就可以立即使用该变量并更新页面中的信息。 与需要从 DOM 读取各种节点的 XML 相比,使用 JSON 非常容易。 我们需要做的就是发送一个 Ajax 请求并将服务器返回的 JSON 数据分配给一个变量。 许多 Ajax 框架已经包含处理 JSON 数据的功能。 例如,(一个流行的库:)提供了 () 方法,可以直接将服务器返回的 JSON 文本转换为变量:
新的 Ajax。("", {
: “得到”,
: () {
var json = ..();
// TODO: .write(json.xxx);
});
服务端输出JSON格式数据
接下来我们讨论如何在服务器端输出JSON格式的数据。 以 Java 为例,我们将演示将 Java 对象编码为 JSON 格式的文本。
将对象编码为 JSON 格式时,只需处理特殊字符。 另外,字符串必须用(")表示,而不是('):
复制代码代码如下:
(s) {
sb = 新的 (s.()+20);
sb.('\"');
for (int i=0; ichar c = s.(i);
(C) {
案件 '\”':
sb.("\\\"");
休息;
案件 '\\':
sb.(“\\\\”);
休息;
案件 '/':
sb.("\\/");
休息;
案例“\b”:
sb.("\\b");
休息;
案例“\f”:
sb.("\\f");
休息;
案例“\n”:
sb.("\\n");
休息;
案例“\r”:
sb.("\\r");
休息;
案例“\t”:
sb.("\\t");
休息;
:
某人(c);
sb.('\"');
某人();
将其表示为 JSON 会容易得多。 利用Java的多态性,我们可以处理Long、Float等格式:
复制代码代码如下:
( ) {
.();
类型也可以直接通过 () 方法用 JSON 表示:
复制代码代码如下:
(布尔){
布尔。();
要将数组编码为 JSON 格式,可以在循环中对每个元素进行编码:
复制代码代码如下:
([] 大批) {
if (数组.==0)
“[]”;
sb = new (数组.sb.('[');
for ( o : 数组) {
某人((o));
某人(',');
// 将最后添加的 ',' 更改为 ']':
sb.(sb.()-1, ']');
某人();
最后,我们需要将Map编码为JSON格式,因为它实际上对应于Java的Map。 方法如下:
复制代码代码如下:
(地图地图){
如果(地图。())
“{}”;
sb = new (map.size() sb.('{');
设置键=map.();
对于(键:键){
值=map.get(key);
sb.('\"');
某人(关键);
sb.('\"');
sb.(':');
sb.((值));
某人(',');
// 将最后一个 ',' 更改为 '}':
sb.(sb.()-1, '}');
某人();
为了统一处理任何Java对象,我们编写一个入口方法(),可以将任何Java对象编码为JSON格式:
复制代码代码如下:
(o){
如果(o==null)
“无效的”;
如果(o)
(()o);
如果(o)
(()o);
如果(o)
(()o);
if (o 地图)
((地图)o);
如果(o[])
(([])o);
throw new(" 类型:" + o.().());
我们不对 Java 对象进行严格的检查。 不支持的对象(比如List)会直接抛出。 另外,为了保证输出的JSON有效,Map对象的Key不能包含特殊字符。 细心的读者可能还会发现,循环引用对象会导致无限递归。 例如,通过仔细构建循环引用的 Map,可以检测到:
复制代码代码如下:
@Test(=.class)
无效(){
地图map=new();
map.put("键", 地图);
。(地图);
幸运的是,服务器处理的 JSON 数据最终应该转换为简单的对象,因此递归引用的可能性很小。
最后,通过或MVC框架输出JSON时,需要设置正确的MIME类型(/json)和字符编码。 假设服务器使用UTF-8编码,可以使用以下代码输出编码后的JSON文本:
复制代码代码如下:
.("/json;=UTF-8");
.("UTF-8");
密码 = .();
pw.write(.(obj));
pw.flush();
概括
JSON 已经成为标准的一部分。 目前主流浏览器对JSON的支持非常完善。 使用 JSON,我们可以摆脱 XML 解析。 对于那些使用Ajax的Web 2.0网站来说,JSON确实是目前最灵活、最轻量级的解决方案。