JSON
https://github.com/douglascrockford/JSON-js
JSON是JavaScript Object Notation的简写,是JavaScript对象表示法,即使用JavaScript语法来描述数据对象,但是又独立于语言和平台。JSON是轻量级的纯文本数据交换格式,具有层级结构,容易理解。与XML比较,具有更小、更快、更易解析的特点(没有结束标签、更短、读写的速度快,且能使用内建的JavaScript eval()方法进行解析)。
JSON语法
数据在名称/值中,即 key/value(键/值)对
- 名称:必须是字符串
- 值:可以是数字(整数、浮点数)、字符串、逻辑值(true、false)、数组(在中括号中)、对象(在大括号中)、null
- key 和 value 中使用冒号:分割
- 每个 key/value 对使用逗号,分割
- 数据由逗号分隔
- 大括号保存对象
- 中括号保存数组
- 逗号分隔数据
JSON数据定义
var personInfo = {
"name":"devZhang",
"height":83.2,
"age":null,
"male":true,
"company":[
{"name":"公司1"},
{"name":"公司2"},
{"name":"公司3"},
{"name":"公司4"},
{"name":"公司n"}
],
"team":[
"iOS",
"Android",
"Java",
"H5",
[
"dev01",
"dev02"
]
],
"education":{
"school":"xx大学",
"education":"学士",
"time":"20xx~20xx",
"course":[
"C语言",
"Java课程",
"网络基础"
]
}
};
JSON数据的使用
使用点号.来访问对象的值,或使用中括号[]来访问对象的值。
- 获取:
- 单个属性值的获取
- 多个属性值的获取 ,即循环获取(注意:只能使用中括号来获取,不能使用点号来获取)
// 单个值
var name = personInfo.name;
var name = personInfo["name"];
var company = personInfo.company[0].name;
var school = personInfo.education.school;
// 多个值
for (x in sites)
{
var value = personInfo[x];
}
- 修改
personInfo.name = "devZhangTmp";
- 删除
delete personInfo.name;
delete personInfo["name"];
数据格式转换:JSON通常用于与服务端交换数据,即发送数据给服务端,或从服务端接收数据。
字符串转换成对象:JSON.parse()的使用
接收服务器数据时一般是字符串,因此需要通过方法JSON.parse()将字符串转换成对象进行使用。
格式:JSON.parse(text字符串, reviver转换结果函数)
示例:
- 无reviver情况
var text = '{ "name":"devZhang", "job":"iOSDev", "workDate":"2007-07-01"}'
var obj = JSON.parse(text);
var name = obj.name;
- 有reviver情况
var text = '{ "name":"devZhang", "job":"iOSDev", "workDate":"2007-07-01"}'
var obj = JSON.parse(text, function (key, value) {
if (key == "workDate"){
return new Date(value);
} else {
return value;
}
});
var name = obj.name;
// 等价于使用eval("(" + 字符串 + ")"),即
var obj = eval("(" + text + ")");
对象转换成字符串:JSON.stringify()的使用
向服务端发送的数据一般时字符串,因此需要通过方法JSON.stringify()将对象转换成字符串进行使用。
格式:JSON.stringify(value有效的JSON字符串, replacer转换结果的函数或数组, space文本添加缩进/空格/换行符)
示例:
var obj = { "name":"devZhang", "job":"iOSDev", "workDate":"2007-07-01"};
var textJSON = JSON.stringify(obj);
函数解析
JSON中的值不允许包含函数,但你可以将函数作为字符串存储,之后再将字符串转换为函数。
示例:
字符串转的对象时的解析:
var text = '{ "name":"devZhang", "alexa":"function () {return 11;}"}';
var obj = JSON.parse(text);
obj.alexa = eval("(" + obj.alexa + ")"); // 字符串函数解析后再调用
var message = obj.name + " Alexa 排名:" + obj.alexa();
注意:要 eval 这里要添加(‘(’ + obj.alexa + ‘)’)呢?原因在于:eval 本身的问题。 由于 json 是以 {} 的方式来开始以及结束的,在 js 中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使 eval 函数在处理 JavaScript 代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量 {},如若不加外层的括号,那么 eval 会将大括号识别为j avascript 代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。
对象转字符串时的解析:
var obj = { "name":"devZhang", "alexa":function () {return 11;}};
obj.alexa = obj.alexa.toString(); // 函数转换成字符串再转换成对象
var text = JSON.stringify(obj);
使用注意:
- 访问对象时,使用点号,或中括号
- 循环访问对象时,使用中括号
- JSON不允许包含函数,但可以将函数作为字符串存储,使用时再将字符串转换成函数,JSON.parse()解析时正常使用,JSON.stringify()解析时会删除函数