-
JSON格式
每个JSON对象就是一个值,可能是一个数组或对象,也可能是一个原始类型的值,只能是一个值,不能是两个或更多的值.
JSON 对值的类型和格式有严格的规定
-
复合类型的值只能是数组或者对象,不能是函数/正则表达式对象/日期对象.
-
原始类型的值只有四种: 字符串/数值(十进制)/布尔值和null,
不能使用Nan , Infinity, -Infinity , undefined
-
字符串必须使用双引号表示,不能使用单引号.
-
对象的键名必须放在双引号里面.
-
数组或对象最后一个成员的后面 , 不能加逗号.
以下是合法JSON
["one","two","three"] {"one":1,"two":2,"three":3} {"names":["张三","李四"]
以下都是不合法的 JSON。
{ name: "张三", 'age': 32 } // 属性名必须使用双引号 [32, 64, 128, 0xFFF] // 不能使用十六进制值 { "name": "张三", "age": undefined } // 不能使用 undefined { "name": "张三", "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'), "getName": function () { return this.name; } } // 属性值不能使用函数和日期对
-
-
JSON对象
是JS的原生对象,用来处理JSON格式数据.它有两个静态方法:
JSON.stringify( ) and JSON.parse( );
JSON.stringify( )
该方法用于将一个值转换为符合JSON格式字符串,此字符串可以被JSON.parse 方法还原.
- 注意,对于原始类型字符串,转换结果会带双引号.
JSON.stringify('foo') // "\"foo\""
- 如果对象的属性是 undefined 函数或者XML对象,该属性会被JSON.stringify 过滤.
var obj = { a:undefined, b:function(){} } JSON.stringify(obj) // "{}"
-
如果数组的成员是 undefined 函数或 XML对象 ,则这些值会被转成null.
var arr = [undefined,function(){}]; JSON.stringify(arr) //"[null,null]"
-
正则对象会被转换成空对象
JSON.stringify(/foo/) //"{}"
-
JSON.stringify 方法会忽略对象的不可遍历属性
var obj = {}; Object.defineProperties(obj,{ 'foo':{ value:1, enumerable:true }, 'bar':{ value:2, enumerable:false } }); JSON.stringify(obj); // "{"foo":1}"
-
JSON.stringify
方法还可以接受一个数组,作为第二个参数,指定需要转成字符串的属性。var obj = { 'prop1': 'value1', 'prop2': 'value2', 'prop3': 'value3' }; var selectedProperties = ['prop1', 'prop2']; JSON.stringify(obj, selectedProperties) // "{"prop1":"value1","prop2":"value2"}"
上面代码中,
JSON.stringify
方法的第二个参数指定,只转prop1
和prop2
两个属性。但是此规则只适用于对象的属性
-
第二个参数还可以是一个函数,用来更改
JSON.stringify
的返回值。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.stringify
还可以接受第三个参数,用于增加返回的 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 }" */
-
参数对象的 toJSON 方法
如果参数对象有自定义的
toJSON
方法,那么JSON.stringify
会使用这个方法的返回值作为参数,而忽略原对象的其他属性。下面是一个普通的对象。
var user = { firstName: '三', lastName: '张', get fullName(){ return this.lastName + this.firstName; } }; JSON.stringify(user) // "{"firstName":"三","lastName":"张","fullName":"张三"}"
现在,为这个对象加上
toJSON
方法。var user = { firstName: '三', lastName: '张', get fullName(){ return this.lastName + this.firstName; }, toJSON: function () { return { name: this.lastName + this.firstName }; } }; JSON.stringify(user) // "{"name":"张三"}"
JSON.parse( )
如果传的字符串不是有效的JSON格式, 该方法会报错.
为了处理解析错误,可以将
JSON.parse
方法放在try...catch
代码块中。try { JSON.parse("'String'"); } catch(e) { console.log('parsing error'); }
标准库之JSON对象
最新推荐文章于 2023-08-04 15:33:14 发布