(77)Wangdao.com第十五天_JavaScript 用于数据交换的文本格式 JSON 对象
JSON 对象
JSON (JavaScript Object Notation 的缩写)
也是一种数据,是 JavaScript 的原生对象,用来处理 JSON 格式数据。它有两个静态方法:JSON.stringify()
和 JSON.parse()
是一种无序的属性名和属性值的集合,用于网站的前后台交互。
- 在前后台交互的时候,虽然数据的格式是 json,但要用字符串的形式进行传递
- 发送时,使用 JSON.stringify( json对象 ) 将 json 对象转换成字符串。
- 接收时,用 JSON.parse(字符串形式的 json ) 解析成 json 对象。
var p = { name: '周杰伦', age: 40 }; var jsonObj = { "name":"陶喆", "age":"45", "gender":"true", };
// 发送
var jsonStr = JSON.stringify(jsonObj); //
// 接收
var jsonObj = JSON.parse(jsonStr); //
// for...in...遍历 json对象
for var k in jsonObj{
console
} - JSON 格式是用于数据交换的文本格式
- 2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。
- JSON 迅速被接受,已经成为各大网站交换数据的标准格式,并被写入标准。
- 目的是取代繁琐笨重的 XML 格式。
- 两个显著的优点:
- 书写简单,一目了然;
- 符合 JavaScript 原生语法,可以由解释引擎直接处理,不用另外添加解析代码。
- 每个 JSON 对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值。总之,只能是一个值,不能是两个或更多的值。
- JSON 对值的类型和格式有严格的规定
- 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象
- 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)
- 字符串必须使用双引号表示,不能使用单引号
- 对象的键名必须放在双引号里面
- 数组或对象最后一个成员的后面,不能加逗号
- JSON.stringify()
- 第一个参数为JSON对象,将转为 ' JSON 字符串' 。该字符串符合 JSON 格式,并且可以被
JSON.parse
方法还原 - 第一个参数如果是原始类型的字符串,结果会带双引号,转换为 "JSON字符串"。
- 这是因为将来还原的时候,内层双引号可以让 JavaScript 引擎知道,这是一个字符串,而不是其他类型的值
JSON.stringify('foo') === "foo" // false JSON.stringify('foo') === "\"foo\"" // true //字符串foo,被转成了"\"foo"\"。 // 这是因为将来还原的时候,内层双引号可以让 JavaScript 引擎知道,这是一个字符串,而不是其他类型的值 JSON.stringify(false); // "false" // 由于没有内层双引号,所以原始值是布尔,而不是字符串 JSON.stringify('false'); // "\"false\""
- 这是因为将来还原的时候,内层双引号可以让 JavaScript 引擎知道,这是一个字符串,而不是其他类型的值
- 如果对象的属性值是
undefined
、函数或 XML 对象,该属性会被JSON.stringify
过滤 - 如果数组的成员是
undefined
、函数或 XML 对象,则这些值被转成null
- 正则对象会被转成空对象 JSON.stringify(/foo/) // "{}"
-
- 会忽略对象的不可遍历的属性
-
var obj = {}; Object.defineProperties(obj, { 'foo': { value: 1, enumerable: true }, 'bar': { value: 2, enumerable: false } }); JSON.stringify(obj); // "{"foo":1}"
-
- 还可以接受接受一个数组,作为第二个参数,指定需要转成字符串的属性。。。只对对象的属性有效,对数组无效
- 指定要解析的属性
-
var obj = { 'prop1': 'value1', 'prop2': 'value2', 'prop3': 'value3' }; var selectedProperties = ['prop1', 'prop2']; JSON.stringify(obj, selectedProperties); //{"prop1":"value1","prop2":"value2"}"
-
- 指定要解析的属性
- 第二个参数还可以是一个函数,用来更改
JSON.stringify
的返回值 - 函数,接受两个参数,分别是被转换的对象的键名和键值
- 递归处理所有的键。每次递归处理前一次修改后的对象
- 如果处理函数返回
undefined
或没有返回值,则该属性会被忽略o
-
function f(key, value) { if (typeof value === "number") { value = 2 * value; } return value; } JSON.stringify({ a: 1, b: 2 }, f); // '{"a": 2,"b": 4}'
-
- 还可以接受第三个参数,用于增加返回的 JSON 字符串的可读性。
- 如果是数字,表示每个属性前面添加的空格(最多不超过10个)
- 如果是字符串(不超过10个字符),则该字符串会添加在每行前面
-
JSON.stringify({ p1: 1, p2: 2 }, null, 2); /* "{ "p1": 1, "p2": 2 }" */ JSON.stringify({ p1:1, p2:2 }, null, '|-'); /* "{ |-"p1": 1, |-"p2": 2 }" */
-
- 第一个参数,即JSON对象,如果含有 toJSON() 方法,则直接使用这个方法的返回值作为参数,而忽略原对象的其他参数
- Date 就拥有自己的 toJSON() 方法
toJSON
方法的一个应用是,将正则对象自动转为字符串。JSON.stringify
默认不能转换正则对象,但是设置了toJSON
方法以后,就可以转换正则对象了var obj = { reg: /foo/ }; // 不设置 toJSON 方法时 JSON.stringify(obj) // "{"reg":{}}" // 设置 toJSON 方法时 RegExp.prototype.toJSON = RegExp.prototype.toString; JSON.stringify(/foo/) // ""/foo/""
- 会忽略对象的不可遍历的属性
- JSON.parse()
- 用于将 JSON 字符串转换成对应的值
- 如果传入的字符串不是有效的 JSON 格式,
JSON.parse
方法将报错 - 为了处理解析错误,可以将
JSON.parse
方法放在try...catch
代码块中-
try { JSON.parse("'String'"); } catch(e) { console.log('parsing error'); }
-
- 可以接受一个处理函数,作为第二个参数,用法与
JSON.stringify
方法类似-
function f(key, value) { if (key === 'a') { return value + 10; } return value; } JSON.parse('{"a": 1, "b": 2}', f); // {a: 11, b: 2}
-
--------小尾巴
________一个人欣赏-最后一朵颜色的消逝-忠诚于我的是·一颗叫做野的心.决不受人奴役.怒火中生的那一刻·终将结束...