JSON
目录
JSON(Javascript Object Notaion, javascript 对象表示法), 是一种数据交换格式,能够在服务器端交换数据, 2001年由Douglas Crockford提出,目的是取代繁琐笨重的XML格式。
JSON 数据格式的优点:
- 与语言无关的文本数据格式
- 轻量、简单、易维护
- 是javascript编程语言的一个子集(Standard ECMA-262 3rd Edition - December 1999), 符合javascript 语言语法,可以使用javascript提供的方法直接解析处理
JSON 建立在两种数据结构上:
- 键 / 值对:各种语言中可以为 字符串、对象、数组或者哈希表
- 有序列表(值):各种语言中实现为数组、向量、列表或者序列
JSON的基本语法:
- JSON 对象
1 | { |
- JSON 数组
1 | ["value", "value", "value"] |
- value 可取值
value 可以是 String(必须使用双引号包裹)、Number、Boolean、null、Object、Array, 这些形式可以嵌套,value值不能是八进制、十六进制(0xF0F)、undefined、function、日期对象,看下面示例:
合格的 JSON 格式:
1 | { |
不合格的 JSON 格式:
1 | // key 必须用双引号包裹,value 如果是字符串必须用双引号包裹 |
如果value的一个String(双引号包围)内包含 \"
、\\
、\/
、\b
、\f
、\n
、\r
、\t
、\u001f
需要使用反斜杠
如果value的一个Number,不能使用八进制和十六进制数值
PS: value对空格没有限制要求
JSON 对象
聊完 JSON 下面我们来聊聊 JSON 对象,javascript 在 ES5中新增了 JSON 对象,用来处理 JSON 文本数据,实现字符串与 JSON 对象间的相互转换,JSON.stringify ( value [ , replacer [ , space ] ] )
和 JSON.parse ( text [ , reviver ] )
, 前者是把 JSON 对象转换为 JSON 字符串,后者的把 JSON 字符串解析为 JSON 对象,下面来详细看看这个两个方法。
JSON.stringify ( value [ , replacer [ , space ] ] )
- 第一个参数: Value 必须项,可以是 Object, Array, String, Boolean, Number, Null.看几个例子:
1 | JSON.stringify({ |
当待转换值不是 JSON 的基本类型时:
- 原始对象 item 值是 undefined、函数或 XML 对象,值会被过滤;
- 数组 item 是 undefined、函数或 XML 对象,值会被转成 null;
- 正则对象会被转换成空对象;
- 对象的不可遍历属性会被忽略;
- 八进制和十六进制会被转换成十进制;
- 特殊字符需要转义成反斜杠
1 | JSON.stringify({ |
- 第二个参数:replacer可选项,可以是 array or function
- 当replacer 是数组时,对第一个参数 value进行过滤,key 不在数组里的不会输出,这里需要注意的是,当第一个参数为Object时才有效,如果为Array,无效,看下面例子:
- 当replacer 是函数时,递归遍历所有的键,可以对对象进行format and replace 等操作
1 | /* replacer 为数组 */ |
- 第三个参数:space 可选项,用于增加format字符的可读性,可取值 Number, String, 但长度不超过10个字符
1 | JSON.stringify({"name": "煦涵", "age": 28, "male": true, "other": null}, '', 4) |
- 特殊情况
还记得上面的几种情况吧,当对象不是原始对象时,处理方式有所不同,比如正则表达式时,会返回空对象,日期对象时返回日期字符串;参看文档是,JSON.stringify发现参数对象有toJSON方法,就直接使用这个方法的返回值作为参数,而忽略原对象的其他参数。
1 | JSON.stringify({ |
JSON.parse ( text [ , reviver ] )
JSON.parse为 JSON.stringify的逆运算,转换时 text 必须符合JSON的语法格式, 不然会报错,reviver 参数 和 JSON.stringify 的参数 replacer类似, 但是遍历顺序和replacer相反。
1 | JSON.parse('{"name":"煦涵","age":28,"male":true,"brother":["B1","B2","B3"],"parent":{"father":{"name":"name"},"mother":{"name":"name"}},"other":null}' ) |
参考文档:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.12
https://github.com/douglascrockford/JSON-js/blob/master/json2.js
http://www.json.org/
转载申请
本作品采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,文章内图片请保留全部内容。