JSON 核心技术应用(免费版)

更新时间:2023-03-08 08:49:08 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

JSON入门教程

尽管有许多宣传关于 XML 如何拥有跨平台,跨语言的优势,然而,除非应用于 Web Services,否则,在普通的 Web 应用中,开发者经常为 XML 的解析伤透了脑筋,无论是服务器端生成或处理 XML,还是客户端用 JavaScript 解析 XML,都常常导致复杂的代码,极低的开发效率。实际上,对于大多数 Web 应用来说,他们根本不需要复杂的 XML 来传输数据,XML 的扩展性很少具有优势,许多 AJAX 应用甚至直接返回 HTML 片段来构建动态 Web 页面。和返回 XML 并解析它相比,返回 HTML 片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。

现在, JSON 为 Web 应用开发者提供了另一种数据交换格式。让我们来看看 JSON 到底是什么,同 XML 或 HTML 片段相比,JSON 提供了更好的简单性和灵活性。

JSON 数据格式解析

和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象。

String,Number 和 Boolean 用 JSON 表示非常简单。例如,用 JSON 表示一个简单的 String “ abc ”,其格式为:

\

除了字符 \,,/ 和一些控制符(b,f,n,r,t)需要编码外,其他 Unicode 字符可以直接输出。

一个 Number 可以根据整型或浮点数表示如下:

这与绝大多数编程语言的表示方法一致,例如:

12345(整数) -3.9e10(浮点数)

Boolean 类型表示为 true 或 false 。此外,JavaScript 中的 null 被表示为 null,注意,true、false 和 null 都没有双引号,否则将被视为一个 String 。

JSON 还可以表示一个数组对象,使用 [] 包含所有元素,每个元素用逗号分隔,元素可以是任意的 Value,例如,以下数组包含了一个 String,Number,Boolean 和一个 null:

[\

JSON相关文档

Object 对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map,而不是 Java 的 Class 。注意 Key 只能用 String 表示。

例如,一个 Address 对象包含如下 Key-Value:

city:Beijing

street:Chaoyang Road postcode:100025(整数)

用 JSON 表示如下:

{\

其中 Value 也可以是另一个 Object 或者数组,因此,复杂的 Object 可以嵌套表示,例如,一个 Person 对象包含 name 和 address 对象,可以表示如下:

{\

{\}

JavaScript 处理 JSON 数据

上面介绍了如何用 JSON 表示数据,接下来,我们还要解决如何在服务器端生成 JSON 格式的数据以便发送到客户端,以及客户端如何使用 JavaScript 处理 JSON 格式的数据。

我们先讨论如何在 Web 页面中用 JavaScript 处理 JSON 数据。我们通过一个简单的 JavaScript 方法就能看到客户端如何将 JSON 数据表示给用户:

function handleJson() {

var j={\

{\ };

document.write(j.name);

document.write(j.address.city); }

假定服务器返回的 JSON 数据是上文的:

{\

- 1 -

JSON相关文档

{\}

只需将其赋值给一个 JavaScript 变量,就可以立刻使用该变量并更新页面中的信息了,相比 XML 需要从 DOM 中读取各种节点而言,JSON 的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求,然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理 JSON 数据的能力,例如 Prototype(一个流行的 JavaScript 库:http://prototypejs.org)提供了 evalJSON() 方法,能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量:

new Ajax.Request(\ method: \

onSuccess: function(transport) {

var json = transport.responseText.evalJSON(); // TODO: document.write(json.xxx); } });

服务器端输出 JSON 格式数据

下面我们讨论如何在服务器端输出 JSON 格式的数据。以 Java 为例,我们将演示将一个 Java 对象编码为 JSON 格式的文本。

将 String 对象编码为 JSON 格式时,只需处理好特殊字符即可。另外,必须用 (\而非 (') 表示字符串:

view plaincopy to clipboardprint? static String string2Json(String s) {

StringBuilder sb = new StringBuilder(s.length()+20); sb.append('\

for (int i=0; i

sb.append(\ break; case '':

sb.append(\ break; case '/':

sb.append(\ break; case 'b':

- 2 -

JSON相关文档

sb.append(\ break; case 'f':

sb.append(\ break; case 'n':

sb.append(\ \

break; case 'r':

sb.append(\ \

break; case 't':

sb.append(\ \ break; default:

sb.append(c); } }

sb.append('\

return sb.toString(); }

static String string2Json(String s) {

StringBuilder sb = new StringBuilder(s.length()+20); sb.append('\

for (int i=0; i

sb.append(\ break; case '':

sb.append(\ break; case '/':

sb.append(\ break; case 'b':

sb.append(\ break; case 'f':

sb.append(\ break;

- 3 -

JSON相关文档

case 'n':

sb.append(\\

break; case 'r':

sb.append(\\

break; case 't':

sb.append(\ \ break; default:

sb.append(c); } }

sb.append('\

return sb.toString(); }

将 Number 表示为 JSON 就容易得多,利用 Java 的多态,我们可以处理 Integer,Long,Float 等多种 Number 格式:

static String number2Json(Number number) { return number.toString(); }

Boolean 类型也可以直接通过 toString() 方法得到 JSON 的表示:

static String boolean2Json(Boolean bool) { return bool.toString(); }

要将数组编码为 JSON 格式,可以通过循环将每一个元素编码出来:

view plaincopy to clipboardprint?

static String array2Json(Object[] array) { if (array.length==0) return \

StringBuilder sb = new StringBuilder(array.length << 4); sb.append('[');

for (Object o : array) { sb.append(toJson(o));

sb.append(',');

- 4 -

JSON相关文档

}

// 将最后添加的 ',' 变为 ']': sb.setCharAt(sb.length()-1, ']'); return sb.toString(); }

static String array2Json(Object[] array) { if (array.length==0) return \

StringBuilder sb = new StringBuilder(array.length << 4); sb.append('[');

for (Object o : array) { sb.append(toJson(o)); sb.append(','); }

// 将最后添加的 ',' 变为 ']': sb.setCharAt(sb.length()-1, ']'); return sb.toString(); }

最后,我们需要将 Map 编码为 JSON 格式,因为 JavaScript 的 Object 实际上对应的是 Java 的 Map 。该方法如下:

view plaincopy to clipboardprint?

static String map2Json(Map map) { if (map.isEmpty()) return \

StringBuilder sb = new StringBuilder(map.size() << 4); sb.append('{');

Set keys = map.keySet(); for (String key : keys) {

Object value = map.get(key); sb.append('\ sb.append(key); sb.append('\ sb.append(':');

sb.append(toJson(value)); sb.append(','); }

// 将最后的 ',' 变为 '}':

sb.setCharAt(sb.length()-1, '}'); return sb.toString();

- 5 -

JSON相关文档

}

static String map2Json(Map map) { if (map.isEmpty()) return \

StringBuilder sb = new StringBuilder(map.size() << 4); sb.append('{');

Set keys = map.keySet(); for (String key : keys) {

Object value = map.get(key); sb.append('\ sb.append(key); sb.append('\ sb.append(':');

sb.append(toJson(value)); sb.append(','); }

// 将最后的 ',' 变为 '}':

sb.setCharAt(sb.length()-1, '}'); return sb.toString(); }

为了统一处理任意的 Java 对象,我们编写一个入口方法 toJson(Object),能够将任意的 Java 对象编码为 JSON 格式:

view plaincopy to clipboardprint?

public static String toJson(Object o) { if (o==null)

return \ if (o instanceof String)

return string2Json((String)o); if (o instanceof Boolean)

return boolean2Json((Boolean)o); if (o instanceof Number)

return number2Json((Number)o); if (o instanceof Map)

return map2Json((Map)o); if (o instanceof Object[])

return array2Json((Object[])o); throw new RuntimeException(\type: \+ o.getClass().getName()); }

public static String toJson(Object o) { if (o==null)

- 6 -

JSON相关文档

return \ if (o instanceof String)

return string2Json((String)o); if (o instanceof Boolean)

return boolean2Json((Boolean)o); if (o instanceof Number)

return number2Json((Number)o); if (o instanceof Map)

return map2Json((Map)o); if (o instanceof Object[])

return array2Json((Object[])o); throw new RuntimeException(\type: \+ o.getClass().getName()); }

我们并未对 Java 对象作严格的检查。不被支持的对象(例如 List)将直接抛出 RuntimeException 。此外,为了保证输出的 JSON 是有效的,Map 对象的 Key 也不能包含特殊字符。细心的读者可能还会发现循环引用的对象会引发无限递归,例如,精心构造一个循环引用的 Map,就可以检测到 StackOverflowException:

@Test(expected=StackOverflowError.class) public void testRecurrsiveMap2Json() {

Map map = new HashMap(); map.put(\ JsonUtil.map2Json(map); }

好在服务器处理的 JSON 数据最终都应该转化为简单的 JavaScript 对象,因此,递归引用的可能性很小。

最后,通过 Servlet 或 MVC 框架输出 JSON 时,需要设置正确的 MIME 类型(application/json)和字符编码。假定服务器使用 UTF-8 编码,则可以使用以下代码输出编码后的 JSON 文本:

response.setContentType(\response.setCharacterEncoding(\PrintWriter pw = response.getWriter(); pw.write(JsonUtil.toJson(obj)); pw.flush();

小结

JSON 已经是 JavaScript 标准的一部分。目前,主流的浏览器对 JSON 支

- 7 -

JSON相关文档

持都非常完善。应用 JSON,我们可以从 XML 的解析中摆脱出来,对那些应用 Ajax 的 Web 2.0 网站来说,JSON 确实是目前最灵活的轻量级方案。

json详细教程

这是个人在最近使用json时做的总结,拿出来给没接触过的小弟们晒晒,适用与没接触过json的人员,其中json2。js请到json官网下载。

1 JSON基础 ............................................................................................................... - 10 -

1.1 JSON的定义.................................................................................................. - 10 - 1.2 JSON的结构.................................................................................................. - 11 - 1.3 JSON的形式.................................................................................................. - 11 - 2 JSON示例 ............................................................................................................... - 15 -

2.1 示例一 .......................................................................................................... - 15 - 2.2 示例二 .......................................................................................................... - 15 - 2.3 值的数组 ...................................................................................................... - 15 - 3 JSON的使用 ........................................................................................................... - 16 -

3.1 JSON官方网站提供的一个开源的JSON解析器和字符串转换器:json.js ........ - 16 -

- 9 -

JSON相关文档

3.2 在JavaScript中使用JSON ............................................................................. - 17 -

3.2.1 3.2.2 3.2.3 3.2.4

将JSON数据赋值给变量..................................................................... - 17 - 访问数据 ............................................................................................. - 17 - 修改JSON数据................................................................................... - 18 - 转换回字符串(见5.3小节) .............................................................. - 18 -

3.3 将JSON发给服务器 ..................................................................................... - 18 -

3.3.1 通过GET以名称/值对发送JSON......................................................... - 19 -

3.3.2 利用POST请求发送JSON数据 .......................................................... - 20 - 3.3.3 JSON就只是文本 ................................................................................. - 20 - 3.4 在服务器上解释JSON................................................................................... - 20 -

3.4.1 处理JSON的两个步骤 ........................................................................ - 20 - 3.4.2 寻找JSON解析器 ............................................................................... - 21 -

3.4.3 使用JSON解析器 ............................................................................... - 21 -

4 JSON的优点和不足................................................................................................. - 22 -

4.1 优点 ............................................................................................................. - 23 - 4.2 不足 ............................................................................................................. - 23 - 5 JSON与XML的比较 .............................................................................................. - 24 -

5.1 可读性 .......................................................................................................... - 24 - 5.2 可扩展性 ...................................................................................................... - 24 -

5.3 编码难度 ...................................................................................................... - 24 - 5.4 解码难度 ...................................................................................................... - 24 - 5.5 实例比较 ...................................................................................................... - 24 - 6 JSON在js中的应用示例 ......................................................................................... - 25 -

6.1 例一 ............................................................................................................. - 25 - 6.2 例二 ............................................................................................................. - 26 - 6.3 例三(json.js包的使用还有些问题) ............................................................. - 26 - 7 用JQuery处理JSON............................................................................................... - 28 -

7.1处理从服务器返回的JSON数据..................................................................... - 28 - 7.2 处理普通JSON数据 ..................................................................................... - 29 -

7.2.1 例一 .................................................................................................... - 29 -

7.2.3 例二 .................................................................................................... - 29 - 7.2.4 例三 .................................................................................................... - 30 - 7.2.4 例四 .................................................................................................... - 30 - 7.2.5 例五 .................................................................................................... - 31 -

1 JSON基础

1.1 JSON的定义

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也

- 10 -

JSON相关文档 使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

1.2 JSON的结构

?

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object)、纪录(record)、结构(struct)、字典(dictionary)、哈希表(hash table)、有键列表(keyed list)或者关联数组 (associative array)。

值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

?

这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使

得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

1.3 JSON的形式

JSON具有一下这些形式:

(1)对象是一个无序的“?名称/值?对”集合。一个对象以“{”开始、“}”结束。每个“名称”后跟一个“:”,“?名称/值? 对”之间使用“,”分隔。

(2)数组是值(value)的有序集合。一个数组以“[”开始、“]”结束。值之间使用“,”分隔。

- 11 -

JSON相关文档

(3)值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

(4)字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一

个字符(character)即一个单独的字符串(character string)。 字符串(string)与C或者Java的字符串非常相似。

- 12 -

JSON相关文档

(5)数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式,除去一些编码细节。

- 13 -

JSON相关文档

空白可以加入到任何符号之间。

- 14 -

JSON相关文档

2 JSON示例

2.1 示例一

在这个例子中,创建了一个对象,它只包含一个成员“bindings”。“bindings”中有一个包含了3个对象的数组,而这每个对象都有“ircEvent”、“method”、“regex”3个成员。

2.2 示例二

按照最简单的形式,可以用下面这样的JSON表示名称/值对:

这个示例非常基本,而且实际上比等效的纯文本名称/值对占用更多的空间:

但是,当将多个名称/值对串在一起时,JSON就会体现出它的价值了。首先,可以创建包含多个名称/值对的记录,比如:

从语法方面来看,这与名称/值对相比并没有很大的优势,但是在这种情况下,JSON更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分,花括号使这些值有了某种联系。

2.3 值的数组

当需要表示一组值时,JSON不但能够提高可读性,而且可以减少复杂性。例如,假设你希望表示一个人名列表。在XML中,需要许多开始标记和结束标记;如果使用JSON,就只需将多个花括号的记录分组在一起:

- 15 -

JSON相关文档

这不难理解,在这个示例中,只有一个名为people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录):

这里最值得注意的是,能够表示多个值,每个值进而包含多个值。但是还应该注意,在不同的主条目(programmers、authors 和 musicians)之间,记录中实际的名称/值对可以不一样。JSON 是完全动态的,允许在 JSON 结构的中间改变表示数据的方式。

在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,甚至可以以不同方式表示同一事物。

3 JSON的使用

3.1 JSON官方网站提供的一个开源的JSON解析器和字符串转换器:json.js

String.parseJSON()解析函数,它将JSON文本解析称object或者array,可以抛出一个语法错误的异常;

Array.toJSONString(), boolean.toJSONString(), date.toJSONString(), number.toJSONString(), object.toJSONString(), string.toJSONString()这几个函数可以生成JSON文本。

下面是一些简单的解析和转换的例子:

- 16 -

JSON相关文档

结果是01

结果是[“0”,”1”]

3.2 在JavaScript中使用JSON

JSON以一种特定的字符串形式来表示 JavaScript 对象。如果将具有这样一种形式的字符串赋给任意一个 JavaScript 变量,那么该变量会变成一个对象引用,而这个对象就是字符串所构建出来的,好像有点拗口,我们还是用实例来说明。

3.2.1 将JSON数据赋值给变量

例如,可以创建一个新的 JavaScript 变量,然后将 JSON 格式的数据字符串直接赋值给它:

这非常简单。现在people包含前面看到的JSON格式的数据,但是,这还不够,因为访问数据的方式似乎还不明显。

3.2.2 访问数据

尽管看起来不明显,但是上面的长字符串实际上只是一个数组;将这个数组放进 JavaScript 变量之后,就可以很轻松地访问它。实际上,只需用点号表示法来表示数组元素。所以,要想访问 programmers 列表的第一个条目的姓氏,只需在JavaScript 中使用下面这样的代码:

- 17 -

JSON相关文档

注意,数组索引是从零开始的。所以,这行代码首先访问 people 变量中的数据;然后移动到称为 programmers 的条目,再移动到第一个记录([0]);最后,访问 lastName 键的值。结果是字符串值“McLaughlin”。

下面是使用同一变量的几个示例。

利用这样的语法,可以处理任何JSON格式的数据,而不需要使用任何额外的JavaScript工具包或API。

3.2.3 修改JSON数据

正如可以用点号和括号访问数据,也可以按照同一的方式轻松地修改数据:

在将字符串转换为JavaScript对象之后,就可以像这样修改变量中的数据。

3.2.4 转换回字符串(见5.3小节)

当然,如果不能轻松地将对象转换回文本格式,那么所有数据修改都没有太大的价值。在JavaScript中这种转换也很简单:

这样就行了。现在就获得了一个可以在任何地方使用的文本字符串,例如,可以将它用作Ajax应用程序中的请求字符串。

更重要的是,可以将任何JavaScript对象转换为JSON文本。并非只能处理原来用JSON字符串赋值的变量。为了对名为myObject的对象进行转换,只需执行相同形式的命令。

如果使用JSON,只需调用一个简单的函数,就可以获得经过格式化的数据,可以直接使用了。

最终结论是:如果要处理大量JavaScript对象,那么JSON几乎肯定是一个好选择,这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式。

3.3 将JSON发给服务器

将JSON发给服务器并不难,但却至关重要,而且还有一些重要的选择要做。但是,一旦决定使用JSON,所要做的这些选择就会十分简单而且数量有限,所以你需要考虑的关注

- 18 -

JSON相关文档 的事情不多,重要的是能够将JSON字符串发送给服务器,而且最好能做到尽快和尽可能简单。

3.3.1 通过GET以名称/值对发送JSON

将JSON数据发给服务器的最简单方法是将其转换成文本,然后以名称/值对的值的方式进行发送。请务必注意,JSON格式的数据是相当长的一个对象,看起来可能会如清单1所示:

清单1. JSON格式的简单JavaScript对象

如果要以名称/值对将其发送到服务器端,应该如下所示:

这看起来不错,但却存在一个问题:在JSON数据中会有空格和各种字符,Web浏览器往往要尝试对其继续编译。要确保这些字符不会在服务器上(或者在将数据发送给服务器的过程中)引起混乱,需要在JavaScript escape()函数中做如下添加:

该函数可以处理空格、斜线和其他任何可能影响浏览器的内容,并将它们转换成 Web 可用字符(比如,空格会被转换成 ,浏览器并不会将其视为空格处理,而是不做更改,将其直接传递到服务器)。之后,服务器会(通常自动)再把它们转换回它们传输后的本来 “面目”。

这种做法的缺点有两个:

(1) 在使用 GET 请求发送大块数据时,对 URL 字符串有长度限制。虽然这个限制很宽泛,但对象的 JSON 字符串表示的长度可能超出您的想象,尤其是在使用极其复杂的对象时更是如此。

(2) 在跨网络以纯文本发送所有数据的时候,发送数据面临的不安全性超出了您的处理能力。

简言之,以上是 GET 请求的两个限制,而不是简单的两个与 JSON 数据相关的事情。在想要发送用户名和姓之外的更多内容,比如表单中的选择时,二者可能会需要多加注意。若要处理任何机密或极长的内容,可以使用 POST 请求。

- 19 -

JSON相关文档

3.3.2 利用POST请求发送JSON数据

当决定使用POST请求将JSON数据发送给服务器时,并不需要对代码进行大量更改,如下所示:

请求使用POST而非GET打开,而且Content-Type头被设臵为让服务器预知它能得到何种数据。在这种情况下,即为

,它让服务器知道现在发送的是文本,正如它从常规的HTML表单中得到的一样。

另一个简单提示是URL的末尾追加了时间。这就确保了请求不会在它第一次被发送后即缓存,而是会在此方法每次被调用后重新创建和重发;此URL会由于时间戳的不同而稍微有些不同。这种技巧常被用于确保到脚本的POST每次都会实际生成新请求且Web服务器不会尝试缓存来自服务器的响应。

3.3.3 JSON就只是文本

不管使用 GET 还是 POST,关键之处在于 JSON 就只是文本。由于不需要特殊编码而且每个服务器端脚本都能处理文本数据,所以可以轻松利用 JSON 并将其应用到服务器。假如 JSON 是二进制格式的或是一些怪异的文本编码,情况就不这么简单了;幸好 JSON 只是常规的文本数据(正如脚本能从表单提交中所接收到的数据,在 POST 段和 Content-Type 头中亦可以看出),所以在将数据发送到服务器时无需太费心。

3.4 在服务器上解释JSON

一旦你编写完客户端 JavaScript 代码、允许用户与 Web 表单和 Web 页的交互、收集发送给服务器端程序以做处理所需的信息,此时,服务器就成为了应用程序(如果调用了异步使用的服务器端程序,则可能是我们认为的所谓的“Ajax 应用程序”)中的主角。在此时,您在客户端所做的选择(比如使用 JavaScript 对象,然后将其转换成 JSON 字符串)必须要与服务器端的选择相匹配,比如使用哪个 API 解码 JSON 数据。

3.4.1 处理JSON的两个步骤

不管在服务器端使用何种语言,在服务器端处理 JSON 基本上就需要两个步骤。

(1) 针对编写服务器端程序所用的语言,找到相应的 JSON 解析器/工具箱/帮助器 API。

(2) 使用 JSON 解析器/工具箱/帮助器 API 取得来自客户机的请求数据并将数据转变成脚本能理解的东西。

以上差不多就是目前所应了解的大致内容了。接下来,我们对每个步骤进行较为详细的

- 20 -

JSON相关文档 介绍。

3.4.2 寻找JSON解析器

寻找 JSON 解析器或工具箱最好的资源是 JSON 站点。在这里,除了可以了解此格式本身的方方面面之外,还可以通过各种链接找到 JSON 的各种工具和解析器,从 ASP 到 Erlang,到 Pike,再到 Ruby,应有尽有。您只需针对自己编写脚本所用的语言下载相应的工具箱即可。为了让服务器端脚本和程序能够使用此工具箱,可以根据情况对其进行选择、扩展或安装(如果在服务器端使用的是 C#、PHP 或 Lisp,则可变性更大)。

例如,如果使用的是 PHP,可以简单将其升级至 PHP 5.2 并用它完成操作;在 PHP 这个最新版本默认包含了 JSON 扩展。实际上,那也是在使用 PHP 时处理 JSON 的最好方法。如果使用的是 Java servlet,json.org 上的

org.json

包显然就是个不错的选择。在这种情

况下,可以从 JSON Web 站点下载 json.zip 并将其中包含的源文件添加到项目构建目录。编译完这些文件后,一切就就绪了。对于所支持的其他语言,同样可以使用相同的步骤;使用何种语言取决于您对该语言的精通程度,最好使用您所熟悉的语言。

3.4.3 使用JSON解析器

一旦获得了程序可用的资源,剩下的事就是找到合适的方法进行调用。比如,假设为 PHP 使用的是 JSON-PHP 模板:

通过该模板,可将获得的所有数据(数组格式的、多行的、单值的或 JSON 数据结构中的任何内容)转换成原生 PHP 格式,放在 $value 变量中。

如果在 servlet 中使用的是 org.json 包,则会使用如下代码:

- 21 -

JSON相关文档

4 JSON的优点和不足

对于JSON,首先要明白JSON和XML一样也是一种简单文本格式。相对于XML,它更加易读、更便于肉眼检查。在语法的层面上,JSON与其他格式的区别是在于分隔数据的字符,JSON中的分隔符限于单引号、小括号、中括号、大括号、冒号和逗号。下图是一个JSON有效负载:

将上面的JSON有效负载用XML改写,如下:

- 22 -

JSON相关文档

是不是很相似?但它们并不相同。下面将详细阐述采用JSON句法的优点和不足。

4.1 优点

乍看上去,使用JSON的数据分隔符的优点可能并不那么明显,但存在一个根本性的缘由:它们简化了数据访问。使用这些数据分隔符时, JavaScript引擎对数据结构(如字符串、数组、对象)的内部表示恰好与这些符号相同。

这将开创一条比DOM技术更为便捷的数据访问途径。下面列举几个JavaScript代码片段来说明这一过程,这些代码片段会访问先前的JSON代码片段中的信息:

(1)访问JSON中的名称: addressbook.name

(2)访问JSON中的地址: addressbook.address.street

(3)访问JSON中的电话号码第一位:addressbook.address.phoneNumbers[0]

JSON的另一个优点是它的非冗长性。在XML中,打开和关闭标记是必需的,这样才能满足标记的依从性;而在JSON中,所有这些要求只需通过一个简单的括号即可满足。在包含有数以百计字段的数据交换中,传统的XML标记将会延长数据交换时间。目前还没有正式的研究表明JSON比XML有更高的线上传输效率;人们只是通过简单的字节数比较发现,对于等效的JSON和XML有效负载,前者总是小于后者。至于它们之间的差距有多大,特别是在新的XML压缩格式下它们的差距有多大,有待进一步的研究。

此外,还有一下一些优点:

(1)轻量级的数据交换格式 (2)人们读写更加容易

(3)易于机器的解析和生成

(4) 能够通过JavaScript中eval()函数解析JSON

(5)JSON支持多语言。包括:ActionScript, C, C#, ColdFusion, E, Java, JavaScript, ML, Objective CAML, Perl, PHP, Python, Rebol, Ruby, and Lua.

4.2 不足

和许多好东西都具有两面性一样,JSON的非冗长性也不例外,为此JSON丢失了XML

- 23 -

JSON相关文档 具有的一些特性。命名空间允许不同上下文中的相同的信息段彼此混合,然而,显然在JSON中已经找不到了命名空间。JSON与XML的另一个差别是属性的差异,由于JSON采用冒号赋值,这将导致当XML转化为JSON时,在标识符(XML CDATA)与实际属性值之间很难区分谁应该被当作文本考虑。

另外,JSON片段的创建和验证过程比一般的XML稍显复杂。从这一点来看,XML在开发工具方面领先于JSON。

5 JSON与XML的比较

5.1 可读性

JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。

5.2 可扩展性

XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

5.3 编码难度

XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

5.4 解码难度

XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。

5.5 实例比较

XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。

现假设有一个用户数据包括:用户名、密码、所在部门、性别、年龄。 用XML表示如下:

- 24 -

JSON相关文档

用JSON表示如下:

与XML一样,JSON也是基于文本的,且它们都使用Unicode编码,同样具有可读性。XML比较适合于标记文档,而JSON却更适合于时行数据交换处理。

6 JSON在js中的应用示例

6.1 例一

1. function showJSON() { 2. var user =

3. {

4. \

5. \20,

6. \ 7.

\

8. [

9. {\

- 25 -

JSON相关文档

10. {\ 11. ] 12. } 13.

14. alert(user.username); 15. alert(user.age);

16. alert(user.info.cellphone); 17. alert(user.address[0].city);

18. alert(user.address[0].postcode); 19. }

这表示一个user对象,拥有username, age, info, address 等属性。 同样也可以用JSON来简单的修改数据,修改上面的例子

6.2 例二

1. function showJSON() { 2. var user = 3. {

4. \ 5. \20,

6. \ 7. \ 8. [

9. {\ 10. {\ 11. ] 12. } 13.

14. alert(user.username); 15. alert(user.age);

16. alert(user.info.cellphone); 17. alert(user.address[0].city);

18. alert(user.address[0].postcode); 19.

20. user.username = \ 21. alert(user.username); 22. }

6.3 例三(json.js包的使用还有些问题)

JSON提供了json.js包,下载http://www.json.org/json.js 后,将其引入然后就可以简单的使用object.toJSONString()转换成JSON数据。

- 26 -

JSON相关文档

1. function showCar() {

2. var carr = new Car(\1968, \

3. alert(carr.toJSONString()); //使用该方法时总是有“对象不支持此属性或方法”的错

误 ,尚未找到问题所在;问题出在json.js中没有定义toJSONString()方法 4. } 5.

6. function Car(make, model, year, color) { 7. this.make = make; 8. this.model = model; 9. this.year = year; 10. this.color = color; 11. }

可以使用eval来转换JSON字符到Object。

1. function myEval() {

2. var str = '{ \ 3. var obj = eval('(' + str + ')'); 4. alert(obj.toJSONString()); 5. }

或者使用parseJSON()方法 1. 2. 3. 4.

function myEval() {

var str = '{ \ var obj = str.parseJSON(); alert(obj.toJSONString());

5. }

解决上述问题的方法代码如下: (1)

var people =

{ \: [

{ \: \, \:\, \: \}, { \: \, \:\, \: \}, { \: \, \:\, \: \} ],

\: [

{ \: \, \: \, \: \}, { \: \, \: \, \: \}, { \: \, \: \, \: \} ],

\: [

{ \: \, \: \, \: \},

- 27 -

JSON相关文档 { \: \, \: \, \: \} ],toJSONString:function(){return(this.programmers[0].firstName)} };

function a(){

alert(people.toJSONString()); } a()

(2)

function myEval() {

var str = { \: \, \: \,toJSONString:function(){return this.name}};

alert(str.toJSONString()); }

7 用JQuery处理JSON

7.1处理从服务器返回的JSON数据

1.页面部分

<%@ page language=\contentType=\pageEncoding=\%> <%@ include file=\%>

用户列表

<%@ include file=\%> 新增用户


  • id:${userinfo.id} name:${userinfo.name}

    namedesc:${userinfo.userDesc}

    查看 修改

    - 28 -

    JSON相关文档

    删除

    2. 后台处理部分

    List oneList=userInfoMgr.findAll();

    net.sf.json.JSONArray jsonArray = net.sf.json.JSONArray.fromObject(oneList); response.setCharacterEncoding(\); response.getWriter().print(jsonArray); return null;

    7.2 处理普通JSON数据

    7.2.1 例一

    1 js代码

    $.each( { name: \ function(i, n){

    alert( \

    });

    2.结果

    Name:name, Value:John Name:lang, Value:JS

    7.2.3 例二

    1 js代码

    - 29 -

    JSON相关文档 $.each( [{ name: \ function(i, n){ alert( \ });

    2 结果

    Name:0, Value: name:John, lang:JS Name:1, Value: name:Johnd, lang:JSd

    7.2.4 例三

    1 js代码

    $.each( { name: {firstName:\ function(i, n){ alert( \alue:\ }); 2 结果

    Name:name, Value:John, ddd Name:lang, Value:undefined, undefined 注:因为lang的值不是JSON数据

    7.2.4 例四

    Jquery 结合Json控制Select下拉框: jquery 操作 Select

    7.2.5 例五

    1 js代码 jQuery.extend(

    { /**

    * @see 将json字符串转换为对象 * @param json字符串

    * @return 返回object,array,string等对象 */

    evalJSON : function (strJson) {

    return eval( \ } });

    jQuery.extend( {

    /**

    * @see 将javascript数据类型转换为json字符串

    * @param 待转换对象,支持object,array,string,function,number,boolean,regexp

    - 31 -

    JSON相关文档 * @return 返回json字符串 */

    toJSON : function (object) {

    var type = typeof object; if ('object' == type) {

    if (Array == object.constructor) type = 'array';

    else if (RegExp == object.constructor) type = 'regexp'; else

    type = 'object'; }

    switch(type) {

    case 'undefined': case 'unknown': return; break; case 'function':

    case 'boolean': case 'regexp':

    return object.toString(); break;

    case 'number':

    return isFinite(object) ? object.toString() : 'null';

    break; case 'string':

    return '\ function(){

    var a = arguments[0]; return (a == '\\n') ? '\\\\n':

    (a == '\\r') ? '\\\\r': (a == '\\t') ? '\\\\t': \ }) + '\ break;

    case 'object':

    if (object === null) return 'null'; var results = [];

    for (var property in object) {

    var value = jQuery.toJSON(object[property]); if (value !== undefined)

    results.push(jQuery.toJSON(property) + ':' + value);

    - 32 -

    JSON相关文档 }

    return '{' + results.join(',') + '}'; break; case 'array':

    var results = [];

    for(var i = 0; i < object.length; i++) {

    var value = jQuery.toJSON(object[i]);

    if (value !== undefined) results.push(value); }

    return '[' + results.join(',') + ']'; break; } } });

    var obj = {

    name : \

    friend : [\ action : function(){alert(\ boy : true, age : 26,

    reg : /\\b([a-z]+) \\1\\b/gi, child : { name : \ age : -1 } };

    var json = $.toJSON(obj); alert(json);

    var objx = $.evalJSON(json); alert(objx); 2 结果

    {name : \friend : [\action : function(){alert(\boy true, age : 26, reg : /\\b([a-z]+) \\1\\b/gi, child : { name : \[object, Object]

    - 33 -

    :

    本文来源:https://www.bwwdw.com/article/ryd3.html

  • Top