标签:
一、理解json
json(javascript object notation,javascript对象表示法);
json是javascript的一个严格的子集,利用了javascript中的一些模式来表示结构化数据;
json是一种数据格式,不是一种编程语言,并不是只有javascript才使用json;
json可以表示以下三种类型的值:
(1) 简单值:可以表示字符串,数值,布尔值和null,但json不支持undefined;
(2) 对象;
(3) 数组;
javascript字符串与json字符串的最大区别在于,json字符串必须使用双引号(单引号会导致语法错误)。
json中的对象与js字面量有一些不同:
(1) json中的对象要求给属性加引号;
(2) 没有声明变量(json中没有变量的概念);
(3) 没有末尾的分号;
注意:json对象的属性必须加双引号;
同一个对象中绝对不应该出现两个同名属性;
json数组也没有变量和分号;
对象和数组通常是json数据结构的最外层形式(当然,这不是强制规定的),利用它们能够创造出各种各样的数据结构;
ex:js之数组
var searchList = [
{ title: ‘孕妇可以吹空调吗‘, url: ‘http://iask.fh21.com.cn/question/2978196.html‘ },
{ title: ‘夏季坐月子饮食应该注意什么‘, url: ‘http://iask.fh21.com.cn/question/2953312.html‘ },
{ title: ‘人流后多久能同房‘, url: ‘http://www.fh21.com.cn/fuke/yc/rl/jbcs/387316.html‘ },
{ title: ‘人流时出血太多怎样办‘, url: ‘http://www.fh21.com.cn/fuke/yc/rl/jbcs/387987.html‘ }
];
ex:js之复杂对象
var searchData = {
"www": { //综合
"defaultVal": "请输入关键字查找",
"url": "http://so.fh21.com.cn",
"tag": false,
"data": [
{ title: ‘孕妇可以吹空调吗‘, url: ‘http://iask.fh21.com.cn/question/2978196.html‘ },
{ title: ‘夏季坐月子饮食应该注意什么‘, url: ‘http://iask.fh21.com.cn/question/2953312.html‘ }
]
},
"yyk": { //找医院
"defaultVal": "请输入医院名称",
"url": "http://so.fh21.com.cn/?type=hospital",
"tag": false,
"data": [
{ title: "北京协和医院", url: "http://yyk.fh21.com.cn/hospital_59.html" },
{ title: "北京301医院", url: "http://yyk.fh21.com.cn/hospital_2.html" }
]
}
}
json的优势:可以把json数据结构解析为有用的js对象;
早期的json解析器基本上使用js的eval()函数;
ECMAScript5对解析json的行为进行规范,定义了全局对象JSON;
支持这个对象的浏览器有ie8+、firefox3.5+、safari4+、chrome和opera10.5+。
对于较早版本的浏览器,可以使用一个shim:https://github.com/douglascrockford/JSON-js。
在旧版本的浏览器中,使用eval()对json数据结构求存在风险,因为可能会执行一些恶意代码。
对于不能原生支持JSON解析的浏览器,使用这个shim是最佳选择。
JSON对象的两个方法:
(1) stringfy(),把js对象序列化为json字符串;
(2) parse(),把json字符串解析为原生js值;
说明:默认情况下,JSON.stringfy()输出的JSON字符串不包含任何空格字符或缩进;
在序列化js对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。值为undefined的任何属性也会被跳过;
如果传给JSON.parse()的字符串不是有效的JSON,该方法会抛出错误;
JSON.stringfy(param1,param2,param3)
param1:js对象;
param2:过滤器(可以是一个数组,也可以是一个函数(替换(过滤)函数replacer));
param3:标识(表示是否在json字符串中保留缩进);
param2说明:
如果过滤器参数是数组,那么JSON.stringify()的结果中将只包含数组中列出的属性。
如果第二个参数是函数,行为会稍有不同。传入的函数接收两个参数,属性(键)名和属性值。根据属性(键)名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串。
为了改变序列化对象的结果,函数返回的值就是相应键的值。不过要注意,如果函数返回了undefined,那么相应的属性会被忽略。
Firefox 3.5和3.6对JSON.stringify()的实现有一个bug,在将函数作为该方法的第二个参数时这个bug就会出现,即这个函数只能作为过滤器:返回undefined意味着要跳过某个属性,而返回其他任何值都会在结果中包含相应的属性。Firefox 4修复了这个bug。
param3说明:
如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。
JSON.stringify()也在结果字符串中插入了换行符以提高可读性。只要传入有效的控制缩进的参数值,结果字符串就会包含换行符。(只缩进而不换行意义不大。)最大缩进空格数为10,所有大于10的值都会自动转换为10。
缩进字符串最长不能超过10个字符长。如果字符串长度超过了10个,结果中将只出现前10个字符。
有时候,JSON.stringify()还是不能满足对某些对象进行自定义序列化的需求。在这些情况下,可以给对象定义toJSON()方法,返回其自身的JSON数据格式。原生Date对象有一个toJSON()方法,能够将JavaScript的Date对象自动转换成ISO 8601日期字符串(与在Date对象上调用toISOString()的结果完全一样)。
可以为任何对象添加toJSON()方法;
toJSON()可以作为函数过滤器的补充。
假设把一个对象传入JSON.stringify(),序列化该对象的顺序如下。
(1) 如果存在toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
(2) 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
(3) 对第(2)步返回的每个值进行相应的序列化。
(4) 如果提供了第三个参数,执行相应的格式化。
JSON.parse(param1,param2)
param1:json字符串;
param2:一个函数(还原函数reviver);
如果还原函数返回undefined,则表示要从结果中删除相应的键;如果返回其他值,则将该值插入到结果中。在将日期字符串转换为Date对象时,经常要用到还原函数。
标签:
原文地址:http://www.cnblogs.com/pengjielee/p/4441059.html