梳理json的主体
一、什么是json?
(一)定义
JSON:JavaScript Object Notation(JavaScript 对象表示法)
JSON 是存储和交换文本信息的语法。类似 XML。
目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。
JSON 通常用于与服务端交换数据。
(二)json和xml的比较
- 可读性方面。
JSON和XML的数据可读性基本相同,JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些。
- 数据体积方面。
JSON相对于XML来讲,数据的体积小,
- 数据交互方面。
JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。
- 数据描述方面。
JSON对数据的描述性比XML较差。
- 传输速度方面。
JSON的速度要远远快于XML。
二、json对象
(一)对象语法:
- JSON 对象使用在大括号{}中书写。
- 对象可以包含多个 key/value(键/值)对。
- key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。
- key 和 value 中使用冒号(:)分割。
- 每个 key/value 对使用逗号(,)分割。
(二)基础用法:
- 访问:
可以使用点号(.)来访问对象的值
也可以使用中括号([])来访问对象的值 - 循环对象:可以使用 for-in 来循环对象的属性。
注意:循环对象只能通过 myObj[x] 来获取相应属性的值,而不能使用 myObj.x
嵌套对象:JSON对象可以包含另外一个JSON对象
数组作为 JSON 对象:key/value(键/值)对中value的部分可以为数组。
实例:
myObj = {
"name":"网站",
"num":3,
"sites": [
{ "name":"Google", "info":[ "Android", "Google 搜索", "Google 翻译" ] },
{ "name":"Runoob", "info":[ "菜鸟教程", "菜鸟工具", "菜鸟微信" ] },
{ "name":"Taobao", "info":[ "淘宝", "网购" ] }
]
}
- 修改值:可以使用点号(.)来修改 JSON 对象的值
- 删除对象属性:可以使用 delete 关键字来删除 JSON 对象的属性
注意:运算符 delete 只是将该值置为 undefined,而不会影响数组长度,即将其变为稀疏数组(《JS权威指南》7.5节)。
三、json方法
(一)JSON.parse()
作用
JSON 通常用于与服务端交换数据。
在接收服务器数据时一般是字符串。
我们可以使用 JSON.parse() 方法将数据(字符串)转换为 JavaScript 对象。语法
JSON.parse(text[, reviver])
- 参数说明:
- text:必需, 一个有效的 JSON 字符串。
reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。
注意:
- JSON 不能存储 Date 对象。如果你需要存储 Date 对象,需要将其转换为字符串。之后再将字符串转换为 Date 对象(通过Date()函数)。
- JSON 不允许包含函数,但你可以将函数作为字符串存储,之后再将字符串转换为函数(通过eval()函数)。(看文章最后的实例)
(二)JSON.stringify()
作用
我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串。
语法
JSON.stringify(value[, replacer[, space]])
- 参数说明:
- value : 必需, 一个有效的 JSON 对象。
- replacer :可选。用于转换结果的函数或数组。
space :可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 有可以使用非数字,如:\t。
注意:
- 如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。
- 如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。
注意:
JSON 不允许包含函数,JSON.stringify() 会删除 JavaScript 对象的函数,包括 key 和 value。可以在执行 JSON.stringify( ) 函数前将函数(通过toString( )函数)转换为字符串来避免以上问题的发生。
四、jsonp
(一)、定义
Jsonp(JSON with Padding) :是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
注意: 为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同源策略。
同源策略:现在所有支持JavaScript 的浏览器都会使用这个策略。同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。同源策略详解点这里
(二)、详解
1.一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准。
2.不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如<\script>、<\img>、<\iframe>)。
3、于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理。
4、恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据。
5、这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。
6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。
7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。