JSON

JSON:如果你愿意一层一层剥开我的心,你会发现...这里水很深 深(2)

字号+ 作者:H5之家 来源:H5之家 2017-03-29 15:02 我要评论( )

以下代码引用自这里 var obj1 = {}; // 这只是 JS 对象// 可把这个称做:JSON 格式的 JavaScript 对象 var obj2 = {width:100,height:200,name:rose};// 可把这个称做:JSON 格式的字符串var str1 = {width:100,hei

以下代码引用自这里

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

  • 这第二个参数若是函数 var friend={ "firstName": "Good", "lastName": "Man", "phone":"1234567", "age":18 }; var friendAfter=JSON.stringify(friend,function(key,value){ if(key==="phone") return "(000)"+value; else if(typeof value === "number") return value + 10; else return value; //如果你把这个else分句删除,那么结果会是undefined }); console.log(friendAfter); //输出:{"firstName":"Good","lastName":"Man","phone":"(000)1234567","age":28}

    如果制定了第二个参数是函数,那么这个函数必须对每一项都有返回,这个函数接受两个参数,一个键名,一个是属性值,函数必须针对每一个原来的属性值都要有新属性值的返回。

    那么问题来了, 如果传入的不是键值对的对象形式,而是方括号的数组形式呢? ,比如上面的 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”由于没有在原来的对象中找到而被忽略

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • Introduction to JSON

      Introduction to JSON

      2017-03-29 16:00

    • Linux Shell格式化Json

      Linux Shell格式化Json

      2017-03-28 15:01

    • php中不转义中文字符的 json编码方法

      php中不转义中文字符的 json编码方法

      2017-03-28 15:00

    • Jackson String 转 Json 数据注意事项

      Jackson String 转 Json 数据注意事项

      2017-03-28 14:03

    网友点评
    ;