当前位置: 首页 > Web前端 > HTML

JSON.stringify和JSON.parse

时间:2023-03-29 11:36:06 HTML

JSON对象包含两个方法:一个是parse(),用于解析成JSON对象;另一个是stringify()用于将对象转换为JSON字符串的方法。这两个方法都是常用的JSON.parse该方法的语法为:JSON.parse(text[,reviver])参数说明:text:必填,一个有效的JSON字符串。reviver:可选,一个转换结果的函数,这个函数会被对象的每个成员调用。使用第二个参数的例子,第二个参数可以对待处理的字符串进行一定的操作letresult=JSON.parse('{"a":3}',(k,v)=>{if(k==="")returnvreturnv*2})console.log(result)//{a:6}JSON.stringifyMDN描述了JavaScript对象或值到JSON字符串的转换。默认情况下,此方法具有三个参数JSON。stringify(value[,replacer[,space]])value:必需,要转换的JavaScript值(通常是对象或数组)。替代品:可选。用于转换结果的函数或数组。如果replacer是一个函数,JSON.stringify将调用该函数,为每个成员传入键和值。使用返回值而不是原始值。如果此函数返回undefined,则该成员被排除在外。根对象的键是一个空字符串:“”。如果replacer是数组,则只转换数组中有键值的成员。成员的转换顺序与键在数组中的顺序相同。space:可选,文本缩进,添加空格和换行符,如果space是数字,则返回值文本每一级缩进指定的空格数,如果space大于10,则文本缩进10个空格.空格也可以使用非数字,如:\t。示例JSON.stringify({x:[1,undefined,function(){},Symbol('')]})//{"x":[1,null,null,null]}functionreplacer(key,value){if(typeofvalue==="string"){returnundefined}returnvalue}varfoo={a:"aa",b:"bb",c:1,d:"d",e:5}//使用替换方法过滤掉对象中属于字符串的属性varjsonstr1=JSON.stringify(foo,replacer)console.log(jsonstr1)//{"c":1,"e":5}//当第三个参数传入多个空格时,会增加结果字符串中的空格数console.log(JSON.stringify({a:1},null,""))//{//"a":1//}console.log(JSON.stringify({a:1},null,""))//{"a":1}JSON.stringify方法的实现要考虑实际输出的各种数据类型。输入输出undefined"undefined"boolean"true/false"numberstringtypenumbersymbolundefinednull"null"stringstringNaNInfinity"null"functionundefinedArray出现undefined,function,symbol"null"RegExp"{}"DateDatetoJson()string,执行该方法在包含循环引用(对象相互引用以形成无限循环)的对象上将抛出错误。如果一个普通的Object有一个toJson()方法,序列化toJson()的返回值;如果属性中出现undefined、function、symbol,则忽略;所有以Symbol作为属性键的属性都将被忽略,即使replacer参数是强制包含它们的。另外,其他类型的对象,包括Map/Set/WeakMap/WeakSet,只会序列化可枚举属性实现代码functionmyJsonStringfy(e){lettype=typeofe;//typeof[]'object'//typeof{}'object'if(type!=="object"){letresult=e;//基本数据类型处理if(Number.isNaN(e)||e===Infinity||e===-Infinity){//NaN和Infinity序列化返回"null"result="null"}elseif(type==="function"||type==="undefined"||type==="symbol"){//由于函数序列化返回undefined,所以返回undefined与undefined和symbol一起处理}elseif(type==="string"){return`"${e}"`}returnString(result)}elseif(type==="object"){//处理typeofnull的结果是对象历史遗留BUG控制台.log(e,e.toJSON)if(e===null){return"null"}elseif(e.toJSON&&typeofe.toJSON==="function"){returnmyJsonStringfy(e.toJSON())}elseif(einstanceofArray){//处理数组letresult=[]e.forEach((item,index)=>{//如果Array中出现undefined、function、symbol,则返回stringnull"null";}else{result[index]=myJsonStringfy(item)}})result=`[${result}]`returnresult.replace(/'/g,'"');}else{//正常Objectcaseletresult=[]Object.keys(e).forEach(item=>{console.log("...",item,typeofitem)if(typeofitem!=="symbol"){//键如果是符号对象,则忽略if(e[item]!==undefined&&typeofe[item]!=='function'&&typeofe[item]!=='symbol'){//如果key值为undefined,function,symbol为属性值,忽略结果。push('"'+item+'"'+":"+myJsonStringfy(e[item]));}}})return("{"+result+"}").replace(/'/g,'"');}}}