梳理json

梳理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数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

跨域问题具体参考这里

相关文章