• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
路过者小茅屋
鸡就是鸡,羊就是羊,牛就是牛,你就是你
博客园    首页    新随笔    联系   管理    订阅  订阅

使用Yahoo!web服务的json(Javascript对象标识)

原文地址: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"> 
 7function 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(不算翻译,因为我也听不太懂)

posted @ 2008-12-08 10:25  Reany  阅读(731)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3