原文地址:http://developer.yahoo.com/common/json.html
Json是基于Javascript语言对象标识的一种轻量级的数据格式.但是它的读写操作却不必依赖于Javascript;而且他很容易被任意语言、类库和大多数语言中已经存在的处理json的工具所解析.
为了能够对json及其用法进行全面了解,我们建议你访问Douglas Crockford的JSON.org(我当时看json就是从这个网站上看到的,保证你很快就能知道json是什么,怎么使用,非常推荐大家去看,Reany注),并且顺便浏览此网站上的JSON: The Fat-Free Alternative to XML.
Yahoo!web服务的很多输出格式都已经由XML转变为Josn格式.本篇文章将会描述Yahoo!web服务的json输出和如何在你的程序中使用它.本文包括下面几个部分:
v Json格式总览
v 如何请求JSON输出
v 在你的脚本和应用中使用JSON
v JSON pk XML
JSON格式总览
JSON是基于Javascript对象标识的一种非常简单的文本格式.标识包含以下基本元素:
对象:对象以大括号({})开始和结束.
对象成员:成员由被冒号(:)隔开的字符串和值组成.
数组:数组以大括号开始和结束,它包含内部值.这些值被逗号隔开.
值:这个值可以是字符串,数字,或者对象,或者数组,或者true,false或者null.
字符串:字符串要被双引号括着,它可以容纳unicode字符或者通常的转义字符.
简单的JSON格式如下:

json格式
1

{
2
"Image":
{
3
"Width":800,
4
"Height":600,
5
"Title":"View from 15th Floor",
6
"Thumbnail":
7
{
8
"Url":"http:\/\/scd.mm-b1.yimg.com\/image\/481989943",
9
"Height": 125,
10
"Width": "100"
11
},
12
"IDs":[ 116, 943, 234, 38793 ]
13
}
14
}
在上例中,Image是根级对象,其他所有数据都是它的成员.Width,Height和Title包含数字和字符数据的简单成员.Thumbnail是一个成员包括URL,Height和Width的哈希对象(原文为a nested object,哈希对象是我自己的理解.js中的哈希表就是这样描述的),IDs是一个包含许多哦数字的数组.注意:Url字符串值中的斜杠是为了转义("\/").
如何请求JSON输出
许多支持JSON的Yahoo!web服务使用同一的参数来生成和处理JSON.
v 使用"output=json"获取JSON
v 使用"callback=function"执行回调
v Json pk XML
使用"output=json"形式
Yahoo!web服务默认返回xml格式数据.为了获取JSON格式,你可以在请求中使用"output=json"参数:
http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Madonna&output=json
使用"callback=function"形式:
回调参数(callback=function)把返回的json文本括在括号和你选择的函数内.例如:
class=chttp://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Madonna&output=json&callback=ws_results
回调函数的名字只能是用大小写字母(A-Z,a-z),数字(0-9),圆点(.),下划线(_)和中括号([])
方括号必须是使用UEL-encode.参见下面的注意事项.
回调函数括起来的返回结果如下形式:
class=cws_results( ...json output... );
由于json本身就是Javascript,所以你并不需要解析回调函数中返回的对象..你可以直接访问里面的元素,就好象传递的对象是直接引用你自己的ws_result 函数.
另外,对于金蛋的函数名称,回调参数也可以使用Javascript对象或者数组形式,例如:
class=ccallback=ws_results.obj 或者class=ccallback=ws_results.obj.array[4]
注意:回调参数中请求的方括号必须是URL编码,如:
class=chttp://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Madonna&output=json&callback=ws_results.obj.array%5B4%5D
当客户端Javascript请求web服务时候,回调形式特别有用.通常,使用XMLHttpRequest的web服务请求与浏览器的安全限制(阻止跨域文件的加载)相冲突.这个限制需要你通过放在服务器上的代理来进行请求,或者使用服务器重写技术,让浏览器认为web数据是来自和你web内容同一站点以此来欺骗浏览器.
使用json和回调形式之后,你可以把web请求放在<script>标签内,并且可以使用页内的Javascript代码对结果进行任何操作.使用这种形式,当封装好的web页面加载后,对Yahoo!web服务的json请求也能够加载.这样,代理技术和服务器欺骗技术都可以抛弃了.
实例如下:

Code
1
<html>
2
<head>
3
<title>How Many Pictures Of Madonna Do We Have?</title>
4
</head>
5
</body>
6
<script type="text/javascript">
7
function ws_results(obj)
{
8
alert(obj.ResultSet.totalResultsAvailable);
9
}
10
</script>
11
<script type="text/javascript" src="http://search.yahooapis.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Madonna&output=json&callback=ws_results"></script>
12
<body></body>
13
</html>
保存代码到桌面的madonna.html文件,拖放到浏览器中,神奇的出现了结果.
在你的脚本或应用中使用JSON
JSON文本可以被Javascript通过"eval()"直接编译.
var myObj=eval('('+jsontext+')');
注意:eval会在无安全和健全的检验下对JSON中的文本进行编译..尽管Yahoo!web服务提供的JSON不会包含恶意代码,但是使用一个简单检验JSON文本结构而不执行任何代码的JSON解析器,你会更轻松.crockford.com (json.org)上有一个可用的开源JSON解析器.
安全关注
尽管Yahoo!web服务不包含js代码仅仅包含数据,但是动态脚本标记结构确实把你的DOM暴露给了Yahoo!.如果你对来自Yahoo!web服务的JSON输出和这种DOM暴露方式有安全考虑,请不要使用这种动态脚本标记---你可以使用XMLHttpRequest 然后手动对JSON进行解析,或者使用xml来代替.
JSON pk XML
来自Yahoo!web服务的XML和JSON包含了相同的数据,他们的区别仅仅是格式上的.yahoo开发网上的文档默认是xml的输出格式.
由于依赖于你使用的特殊服务,来自service maps的xml输出格式转化为JSON标记也会不尽相同,但是一般来说,你可以指定以下规则:
一个包含回应(典型的结果集)的顶级对象
简单XML元素(仅包含内容的元素)转换为 string/value对
复杂xml元素(包含嵌套元素)转化为嵌套对象
属性转换为 string/value对
如果一个元素既包含内容又包括属性,属性会转换为string/value对,而内容会转换为名称为content的string/value对
重复的元素映射数组.数组命名在元素后.数组的值依赖于重复元素的内容,也就是说,简单的内容转换为简单的值,嵌套的元素转换为对象.但是请注意,如果返回的是一个包含一个元素的重复元素的特殊回应,那么你收到的不会是一个包括这个元素的JSON数组--这个元素已经被简单的看作一个复杂的XML元素.对于重复的元素,你应该确保你对数组或者单一值的测试.
下面的2个例子说明XML和JSON格式的等价输出格式
XML:

XML
1
<?xml version="1.0" encoding="UTF-8"?>
2
<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:srchmi" xsi:schemaLocation="urn:yahoo:srchmi http://search.yahooapis.com/ImageSearchService/V1/ImageSearchResponse.xsd" totalResultsAvailable="229307" totalResultsReturned="2" firstResultPosition="1"><Result>
3
<Title>madonna 116</Title>
4
<Summary>Picture 116 of 184</Summary>
5
<Url>http://www.celebritypicturesarchive.com/pictures/m/madonna/madonna-116.jpg</Url>
6
<ClickUrl>http://www.celebritypicturesarchive.com/pictures/m/madonna/madonna-116.jpg</ClickUrl>
7
<RefererUrl>http://www.celebritypicturesarchive.com/pgs/m/Madonna/Madonna%20picture_116.htm</RefererUrl>
8
<FileSize>36990</FileSize>
9
<FileFormat>jpeg</FileFormat>
10
<Height>530</Height>
11
<Width>425</Width>
12
<Thumbnail>
13
<Url>http://scd.mm-b1.yimg.com/image/481989943</Url>
14
<Height>125</Height>
15
<Width>100</Width>
16
</Thumbnail>
17
</Result>
18
<Result>
19
<Title>madonna 118</Title>
20
<Summary>Picture 118 of 184</Summary>
21
<Url>http://www.celebritypicturesarchive.com/pictures/m/madonna/madonna-118.jpg</Url>
22
<ClickUrl>http://www.celebritypicturesarchive.com/pictures/m/madonna/madonna-118.jpg</ClickUrl>
23
<RefererUrl>http://www.celebritypicturesarchive.com/pgs/m/Madonna/Madonna%20picture_118.htm</RefererUrl>
24
<FileSize>40209</FileSize>
25
<FileFormat>jpeg</FileFormat>
26
<Height>700</Height>
27
<Width>473</Width>
28
<Thumbnail>
29
<Url>http://scd.mm-b1.yimg.com/image/500892420</Url>
30
<Height>130</Height>
31
<Width>87</Width>
32
</Thumbnail>
33
</Result>
34
</ResultSet>
JSON:

JSON
1

{"ResultSet":
{
2
"totalResultsAvailable":"229307",
3
"totalResultsReturned":"2",
4
"firstResultPosition":"1",
5
"Result":[
6
{
7
"Title":"madonna 116",
8
"Summary":"Picture 116 of 184",
9
"Url":"http:\/\/www.celebritypicturesarchive.com\/pictures\/m\/madonna\/madonna-116.jpg",
10
"ClickUrl":"http:\/\/www.celebritypicturesarchive.com\/pictures\/m\/madonna\/madonna-116.jpg",
11
"RefererUrl":"http:\/\/www.celebritypicturesarchive.com\/pgs\/m\/Madonna\/Madonna%20picture_116.htm",
12
"FileSize":"36990",
13
"FileFormat":"jpeg",
14
"Height":"530",
15
"Width":"425",
16
"Thumbnail":
{
17
"Url":"http:\/\/scd.mm-b1.yimg.com\/image\/481989943",
18
"Height":"125",
19
"Width":"100"
20
}
21
},
22
{
23
"Title":"madonna 118",
24
"Summary":"Picture 118 of 184",
25
"Url":"http:\/\/www.celebritypicturesarchive.com\/pictures\/m\/madonna\/madonna-118.jpg",
26
"ClickUrl":"http:\/\/www.celebritypicturesarchive.com\/pictures\/m\/madonna\/madonna-118.jpg",
27
"RefererUrl":"http:\/\/www.celebritypicturesarchive.com\/pgs\/m\/Madonna\/Madonna%20picture_118.htm",
28
"FileSize":"40209",
29
"FileFormat":"jpeg",
30
"Height":"700",
31
"Width":"473",
32
"Thumbnail":
{
33
"Url":"http:\/\/scd.mm-b1.yimg.com\/image\/500892420",
34
"Height":"130",
35
"Width":"87"
36
}
37
}
38
]
39
}
40
}
离线阅读:使用雅虎web服务的json.pdf
下一个估计是:YUI CSS Fundation(不算翻译,因为我也听不太懂)