JSON.parse 和 JSON.stringify 详解 (2)

数组或对象最后一个成员的后面,不能加逗号。

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.stringify

JSON.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"}\'

如果是一个数组,则只有包含在这个数组中的属性名,才会最终被序列化到结果字符串中;
只对对象的属性有效,对数组无效。

const obj = { json: \'JSON\', parse: \'PARSE\', stringify: \'STRINGIFY\' } JSON.stringify(obj, [\'parse\', \'stringify\']) // \'{"parse":"PARSE","stringify":"STRINGIFY"}\'

如果是一个函数,被序列化的值的每个属性都会经过该函数的转换和处理;

处理过程:

函数有两个参数,属性名(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知道是字符串,而不是变量。

JSON.stringify(\'json\') === \'json\' // false JSON.stringify(\'json\') === \'"json"\' // true

undefined、函数、symbol以及XML对象:

出现在Object对象中时,会被忽略;

出现在数组中时,会被序列化成null;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgywyp.html