JSON的使用・小结

JSON--JavaScript Object Notation (JavaScript对象表示法)


初始JSON的人很容易弄混对象与JSON(我也是刚刚弄清楚 ⊙﹏⊙)。

JSON是一种数据格式,经常有人说什么"把数据变成JSON对象然后@#¥……@¥"。
对象不一定是JSON格式,而JSON格式的数据(以下简称JSON数据)则一定是对象(简单的数据,如1,"ABCD"都算是JSON格式,这里暂且忽略之)
JSON格式是以key-value的形式存放数据的 如:

{
    "name":"Rose",
    "age":25,
    "family":{
        "brother":"Who"
    }
}

这当中value可以是数字,字符串,数组,甚至null,但不能为undefined,function,对象实例和变量,否则该属性会被无视掉。例:

var p = {
    "name":"Rose",
    "family":undefined,
    "age":25,
    "sex":function(){}
}
JSON.stringify(p);//-->'{"name":"Rose","age":25}'
//这里的JSON.stringify是EcmaScript5提供的,JSON是一个处理JSON数据的对象(IE8+ & 其他主流浏览器)。

JSON对象有两个方法parse()stringify();

①JSON.parse(str)是将字符串str转换成JSON数据.如

JSON.parse('{"name":"Ray","age":18}')-->{"name":"Ray","age":18}

②JSON.stringify(json,arg2)将JSON数据序列化。

第一个参数json是JSON数据;
第二个参数是可选的,字符串数组或者函数。如果是数组的话则是只保留key值在数组中存在的属性;函数的话,则可以对灵活的对value进行修改。例:

var json = {"name":"Ray","age":18,"friends":{"id":32,favorite:"TokyoHot"}}
JSON.stringify(json,["age","id"]);//这个key仅限于第一层属性,所以"id"会被无视
-->'{"age":18}'

var json = {"name":"Ray","age":18}
JSON.stringify(json,function(key,value){
    switch(key){
        case "name":return value.length;break;
        case "age":return +value + 10;break;
        default:return value;
    }
});
-->'{"name":3,"age":28}'

③小拓展

通过JSON对象实现对象的深复制(因为使用了JSON对象的stringify方法,所以是有局限性的,对象中不能包含函数和对象实例)

var a = {A:4};
var b = JSON.parse(JSON.stringify(a));

字符串向JSON格式转换的过程中,字符串里不能包含某些具有特殊含义的字符,否则会转换失败.例

var str = '{"name":"NothingGo\sRight"}';
JSON.parse(str);//这里会报错。如果是用jQuery的Ajax获取JSON的话,情况相同。

blacklist整理入下:

\0,\b,\n,\f,\r,
\t,\v,\u,\v,\x


通过使用eval转换JSON格式数据的问题

因为JSON对象在低版本浏览器的普及度低,我们在将序列化的数据向JSON格式转换时没有用JSON对象,而是用eval和Function(这里就不讲它了)。

eval的使用方法

var str = '{"Name":"Ray"}';
var json = eval("(" + str + ")");

这里的问题所在就是,初学者很容易就写成如下格式

var json = eval(str);

结果就报出了令人疑惑的错误:SyntaxError: Unexpected token :
疑惑是因为左看右看str都是正确的格式啊,而冒号也没有问题。
其实真正的原因是使用者没有了解eval的执行机制。
简单的说eval就相当于直接把eval中的字符串当成javascript语句执行,再把返回值赋给前面的变量。
在js中括号括起来的部分会被强行变成表达式。即
var json = {"Name":"Ray"}
而大括号(最外层的)则被理解成包裹代码块的符号。也就是说只会执行大括号里面的内容。
这就成了 var json = "Name":"Ray";毫无疑问那个冒号会引起法错误。

原文地址:https://www.cnblogs.com/TiestoRay/p/2762536.html