数组或对象最后一个成员的后面,不能加逗号。
JSON.parse(\'[1, 2, 3, 4, ]\') // VM2771:1 Uncaught SyntaxError: Unexpected token ] in JSON at position 13 JSON.parse(\'{"key" : 1, }\') // VM2779:1 Uncaught SyntaxError: Unexpected token } in JSON at position 12支持unicode转义。
JSON.parse(\'{"\u0066":333}\') // {f: 333}部分控制字符、转义字符不支持,如\'\n\'、\'\t\'等。
JSON.parse(\'"\n"\') // Uncaught SyntaxError: Unexpected token 解析的其他方法将json字符串转成json对象(js对象值),还可以使用其他方法,但是非安全代码。
const str = \'{"name":"json","age":18}\' const json = JSON.parse(str) const json = eval("(" + str + ")") const json = (new Function("return " + str))() JSON.stringifyJSON.stringify() 将一个JavaScript对象或值转换为JSON格式字符串。
JSON.stringify 语法 JSON.stringify(value[, replacer [, space]])value:将要序列化成 一个 JSON 字符串的JavaScript对象或值。
replacer 可选,用于处理将要序列化的值。
space 可选,指定缩进用的空白字符串,用于美化输出。
返回值: 一个表示给定值的JSON格式字符串。
replacer参数replacer 参数可以以下三种情况:
如果是null、undefined或其他类型,则被忽略,不做处理;
JSON.stringify({key: \'json\'}, null, null) // \'{"key":"json"}\' JSON.stringify({key: \'json\'}, true) // \'{"key":"json"}\'如果是一个数组,则只有包含在这个数组中的属性名,才会最终被序列化到结果字符串中;
只对对象的属性有效,对数组无效。
如果是一个函数,被序列化的值的每个属性都会经过该函数的转换和处理;
处理过程:
函数有两个参数,属性名(key)和属性值(value),都会被序列化;
第一次调用时,key为空字符串,value则为需要序列化的整个对象;
第二次处理时,会把第一次的的结果传过来,后续的每一次的处理都将接收上一次处理的结果;
后面,将依次处理每个属性名和属性值,完成后返回。
JSON.stringify({ json: 1, stringify: { val: \'rr\'} }, (key, value) => { console.log(`key:${key},value:`, value) return value }) // key:,value: {json: 1, stringify: {…}} // key:json,value: 1 // key:stringify,value: {val: \'rr\'} // key:val,value: rr // \'{"json":1,"stringify":{"val":"rr"}}\'value的类型处理:
如果返回基本类型字符串、数字、布尔值、null,则直接被添加到序列化后的JSON字符串中;
如果返回其他对象,则会在后续依次序列化该对象的属性,如果是函数则不作处理;
如果返回或undefined,则不会输出该属性。
序列化数组时,如果value返回undefined或者一个函数,将会被null取代。
JSON.stringify({ json: 1, stringify: \'rr\' }, (key, value) => { if (typeof value === \'number\') { return \'ss\' } return value }) // \'{"json":"ss","stringify":"rr"}\' JSON.stringify({ json: 1, stringify: \'rr\' }, (key, value) => { if (typeof value === \'number\') { value = undefined } return value }) // \'{"stringify":"rr"}\'下面示例,是返回对象值时的处理:
JSON.stringify({ json: 1, stringify: \'rr\' }, (key, value) => { if (typeof value === \'object\') { // 第一次返回整个对象时,类型是object return { parse: \'dd\' } } return value }) \'{"parse":"dd"}\' space 参数space 参数用来控制结果字符串里面的间距,美化输出。可以输入的值有以下三种情况:
如果是一个数字, 序列化时,每一层级比上一层级多缩进对应数字值的空格,范围在 1 - 10,即最小1个最大10个空格;
如果是一个字符串,序列化时,该字符串会添加在每行前面,每一层级比上一层级多缩进该字符串,最多是个字符,超过则截取字符串;
如果是null、undefined或其他类型,则被忽略,不做处理。
JSON.stringify({key: \'json\'}, null, 2) // \'{\n "key": "json"\n}\' JSON.stringify({key: \'json\', list: { str: \'str\' } }, null, \'|-\') // \'{\n|-"key": "json",\n|-"list": {\n|-|-"str": "str"\n|-}\n}\' JSON.stringify({key: \'json\'}, null, null) // \'{"key":"json"}\' JSON.stringify 特性基本类型值字符串、数字、布尔值,以及String、Boolean、Number对象值,都会转成原始值字符串输出。
JSON.stringify(333) // \'333\' JSON.stringify(true) // \'true\' JSON.stringify(new String(\'333\')) //\'"333"\' JSON.stringify(Boolean(true)) // \'true\'基本类型的字符串,转换结果会带双引号。
因为在还原时,双引号会让JavaScript知道是字符串,而不是变量。
undefined、函数、symbol以及XML对象:
出现在Object对象中时,会被忽略;
出现在数组中时,会被序列化成null;