以下代码引用自这里
var obj1 = {}; // 这只是 JS 对象 // 可把这个称做:JSON 格式的 JavaScript 对象 var obj2 = {"width":100,"height":200,"name":"rose"}; // 可把这个称做:JSON 格式的字符串 var str1 = '{"width":100,"height":200,"name":"rose"}'; // 这个可叫 JSON 格式的数组,是 JSON 的稍复杂一点的形式 var arr = [ {"width":100,"height":200,"name":"rose"}, {"width":100,"height":200,"name":"rose"}, {"width":100,"height":200,"name":"rose"}, ]; // 这个可叫稍复杂一点的 JSON 格式的字符串 var str2='['+ '{"width":100,"height":200,"name":"rose"},'+ '{"width":100,"height":200,"name":"rose"},'+ '{"width":100,"height":200,"name":"rose"},'+ ']';另外,除了常见的“正常的”JSON格式,要么表现为一个对象形式 {...} ,要么表现为一个数组形式 [...] ,任何单独的一个10进制数值、双引号字符串、布尔值和null都是有效符合JSON格式的。
3. 一个有意思的地方,JSON不是JS的子集首先看下面的代码,你可以copy到控制台执行下:
var code = '"\u2028\u2029"'; JSON.parse(code); // works fine eval(code); // fails这两个字符 \u2028 和 \u2029 分别表示行分隔符和段落分隔符,JSON.parse可以正常解析,但是当做js解析时会报错。
三、这几个JS中的JSON函数,弄啥嘞在JS中我们主要会接触到两个和JSON相关的函数,分别用于JSON字符串和JS数据结构之间的转化,一个叫 JSON.stringify ,它很聪明,聪明到你写的不符合JSON格式的JS对象都能帮你处理成符合JSON格式的字符串,所以你得知道它到底干了什么,免得它只是自作聪明,然后让你Debug long time;另一个叫 JSON.parse ,用于转化json字符串到JS数据结构,它很严格,你的JSON字符串如果构造地不对,是没办法解析的。
而它们的参数不止一个,虽然我们经常用的时候只传入一个参数。
此外,还有一个 toJSON 函数,我们较少看到,但是它会影响 JSON.stringify 。
1. 将JS数据结构转化为JSON字符串 —— JSON.stringify这个函数的函数签名是这样的:
JSON.stringify(value[, replacer [, space]])下面将分别展开带1~3个参数的用法,最后是它在序列化时做的一些“聪明”的事,要特别注意。
1.1 基本使用 —— 仅需一个参数这个大家都会使用,传入一个JSON格式的JS对象或者数组, JSON.stringify({"name":"Good Man","age":18}) 返回一个字符串 "{"name":"Good Man","age":18}" 。
可以看到本身我们传入的这个JS对象就是符合JSON格式的,用的双引号,也没有JSON不接受的属性值,那么如果像开头那个例子中的一样,how to play?不急,我们先举简单的例子来说明这个函数的几个参数的意义,再来说这个问题。
1.2 第二个参数可以是函数,也可以是一个数组如果第二个参数是一个函数,那么序列化过程中的每个属性都会被这个函数转化和处理
如果第二个参数是一个数组,那么只有包含在这个数组中的属性才会被序列化到最终的JSON字符串中
如果第二个参数是null,那作用上和空着没啥区别,但是不想设置第二个参数,只是想设置第三个参数的时候,就可以设置第二个参数为null
如果制定了第二个参数是函数,那么这个函数必须对每一项都有返回,这个函数接受两个参数,一个键名,一个是属性值,函数必须针对每一个原来的属性值都要有新属性值的返回。
那么问题来了, 如果传入的不是键值对的对象形式,而是方括号的数组形式呢? ,比如上面的 friend 变成这样: friend=["Jack","Rose"] ,那么这个逐属性处理的函数接收到的key和value又是什么?如果是数组形式,那么key是空字符串,而value是这个数组对象,你可以在控制台在这个函数内部打印出来这个key和value验证。
这第二个参数若是数组 var friend={ "firstName": "Good", "lastName": "Man", "phone":"1234567", "age":18 }; //注意下面的数组有一个值并不是上面对象的任何一个属性名 var friendAfter=JSON.stringify(friend,["firstName","address","phone"]); console.log(friendAfter); //{"firstName":"Good","phone":"1234567"} //指定的“address”由于没有在原来的对象中找到而被忽略