JSON
1、为什么用JSON--http://www.jb51.net/article/32830.htm
--json.org是一种简洁有效的数据载体,是一种用字符串表示复杂js对象的方式,后端好生成,前端0解释。
WEB2.0的推动
Ajax引发了Web2.0革命,其中的x是xml。在ajax中xml是作为前后台数据传输的载体的。
随着Web2.0的大规模应用,xml解释的效率问题就暴露无疑了,xml是具有非常严禁的结构,这造成了任何浏览器把xml装入,解释成javaScript可以访问的对象的过程是漫长的。而json是js默认支持的最简洁对象创建方式,js接收他是轻松加愉快的,所以在持久化数据传输的舞台上json靠效率取胜。
JSON本身易用
Ajax为什么一些老技术结合起来突然火了呢,因为易用。说白了自从上世纪有了DHTML,无刷新异步数据传输的解决方式绝不仅仅只有xmlHttpRequest一家。隐藏的iframe完全可以做到,而且一直也有人这么干。Ajax红了在于其易用性,所以几家领军企业对期的大规模应用引发Web2.0.
JSON同样易用,会了JSON之后我已经用var obj = {};var arr = []代替了var obj = new Object();var obj = new Array()。JSON是js中最简洁的对象定义方式,对于会js,用过eval()的朋友基本上没有什么学习成本。
以XML为代表的树形结构的风靡
从数据结构的角度看xml的流行,因为xml是一颗树,树状的数据结构在像xml一样除了本身的内容节点再加上属性节点之后的威力如何大家都有体会,DOM是这种结构,UML是这种结构。
当我们用数据去描述客观世界的时候发现仅仅靠关系数据模型中的二维表已显笨拙,树形结构是更接近思维的一种,这也是人们在做会议记录时不在是notepad而使用freemind的原因。同样使用二维表,记录parentid的方式存储树的效率低下也给了LADP的发展空间。
说回来JSON,他是一种定义JS对象的方式,而JS中的Object是一树的形式组织的实体,所以JSON定义的对象在描述数据的功能上是足够的。
再说几个JSON相关的话题:
JSON是解决xml效率问题的唯一途径么?
也不尽然,在本人不知道json之前,在使用div传输数据。
后台传到前台的是
xmlHttp.responseText = '<div age="18" personid="007">lenel</div>';
然后前台接受数据时使用
function toDivElememnt(s){
var oDiv = document.createElement("div");
oDiv.innerHTML = s;
oDiv = oDiv.firstChild;
return oDiv;
}
这个方法里我没有用js来解释json,而是用DOM来解释HTML串,这也是相当自然的,前面已经说过HTML串也是树状结构,我拿到oDiv之后就可以访问到age,personid等等属性了,效率也是相当可以的,呵呵。
JSON会代替XML么?
不会,在Ajax这个领域可能我们会搞Ajaj,但是XML如果只能干这点事那就不是XML了:)
还没用JSON么?
不要落伍了哈哈,当前主流的后台语言都有在后台生成、解析JSON的API,具体怎么用json,API去哪儿找http://www.json.org看看吧
2、JSON用法
2.1语法
JSON syntax allows the representation of three types of values:
--Simple Values — Strings, numbers, Booleans, and null can all be represented
in JSON using the same syntax as JavaScript. The special value undefined is
not supported.
--Objects — The fi rst complex data type, objects represent ordered key-value pairs. Each
value may be a primitive type or a complex type.
--Arrays — The second complex data type, arrays represent an ordered list of values that
are accessible via a numeric index. The values may be of any type, including simple values,
objects, and even other arrays
There are no variables, functions, or object instances in JSON. JSON is all about representing
structured data, and although it shares syntax with JavaScript, it should not be confused with
JavaScript paradigms.
2.1.1 对象
JSON中的对象与JavaScript字面量稍微有一些不同。JavaScript中的对向字面量:
var person = {
name: “Nicholas”,
age: 29
};
JavaScript中,前面的对象字面量完全可以写成下面这样:
var object = {
“name”: “Nicholas”,
“age”: 29
};
JSON表示上述对象的方式如下:
{
“name”: “Nicholas”,
“age”: 29
}
与JavaScript的对象字面量相比,JSON对象有两个地方不一样:
1、没有声明变量(JSON中没有变量的概念)
2、没有末尾的分号(不是JavaScript语句,所以不需要分号)
对象的属性必须加双引号,这在JSON中是必需的。属性值可以是简单值,可以是复杂类型值。
2.1.2 数组
[
{
“title”: “Professional JavaScript”,
“authors”: [
“Nicholas C. Zakas”
],
edition: 3,
year: 2011
},
{
“title”: “Professional JavaScript”,
“authors”: [
“Nicholas C. Zakas”
],
edition: 2,
year: 2009
}
]
对象和数组通常是JSON数据结构的最外层形式(当然,这不是强制规定的),利用它们能够创造出各种各样的数据结构。
2.2 解析和序列化
JSON之所以流行,拥有与JavaScript类似的语法并不是全部原因。更重要的一个原因是,可以把JSON数据结构解析为有用的JavaScript对象。与XML数据结构要解析成DOM文档而且从中提取数据极为麻烦相比,JSON可以解析为JavaScript对象的优势极其明显。
在DOM结构中查找数据的代码:
doc.getElementsByTagName(“book”)[2].getAttribute(“title”)
早期的JSON解析器基本上就是使用JavaScript的eval()
函数。由于JSON是JavaScript语法的子集,因此eval()函数可以解析、解释并返回JavaScript对象和数组。ECMAScript5对解析JSON的行为进行规范,定义了全局对象JSON。This object is
supported in Internet Explorer 8+, Firefox 3.5+, Safari 4+, Chrome, and Opera 10.5+. A shim for
older browsers can be found at https://github.com/douglascrockford/JSON-js. It’s important not to use eval() alone for evaluating JSON in older browsers because of the risk of executable code. The JSON shim is the best option for browsers without native JSON parsing.The JSON object has two methods: stringify()
and parse()
. In simple usage, these methods serialize JavaScript objects into a JSON string and parse JSON into a native JavaScript value,respectively.
var book = {
title:"bbb",
authors:["a","b"],
edition:3,
year:2011
}
console.log(JSON.stringify(book));
//{"title":"bbb","authors":["a","b"],"edition":3,"year":2011}
2.2.1序列化选项
1、过滤结果
2、字符串缩进
3、toJSON方法
var book2 = {
title:"bbb",
authors:["a","b"],
edition:3,
year:2011,
toJSON:function(){
return this.title
}
}
console.log(JSON.stringify(book2));
//"bbb"
原生Date对象有一个`toJSON()`方法,能够将JavaScript的Date对象自动转换成ISO 8601日期字符串。可以为任何对象添加toJSON()方法。(主要是Date在用)
var d = new Date()
//undefined
d
Tue Apr 21 2015 14:26:00 GMT+0800 (中国标准时间)
d.toJSON()
"2015-04-21T06:26:00.888Z"//使用getTime()毫秒数
2.2.2解析选项
JSON.parse()
过滤