JSON (JavaScript Object Notation)预研
1. 问题
1.1 什么是JSON?
1.2 在什么地方可以用到JSON?
1.3 JSON有什么作用?
1.4 JSON相关的键值对主要表现形式是什么?
1.5 JSON的格式是怎样的?
1.6 用户使用JSON时有哪些优缺点?
1.7 使用JSON和使用XML相比较,JSON的优缺点主要表现在哪里?
2.技术预研
2.1概念
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
2.2用法
2.2.1具体形式
(1)对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
(2)数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
(3)值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
(4)字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 字符串(string)与C或者Java的字符串非常相似。
(5)数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
2.2.2创建一个新的 JavaScript 变量,然后将 JSON 格式的数据字符串直接赋值给它如:
Var people={"programmers":[{"firstName":"Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] }
2.2.3访问数据
people.programmers[0].lastName; // Value is " McLaughlin "
people.authors[1].genre // Value is "fantasy"
people.musicians[3].lastName // Undefined. This refers to the fourth entry, and there isn't one
people.programmers[2].firstName // Value is "Elliotte"
2.2.4修改 JSON 数据
正如可以用点号和括号访问数据,也可以按照同样的方式轻松地修改数据:
people.musicians[1].lastName = "Rachmaninov";
在将字符串转换为 JavaScript 对象之后,就可以像这样修改变量中的数据。
有关字符串与JSON的有关浏览器中转换的方法:在Firefox,chrome,opera,safari,ie9,ie8等高级浏览器直接可以用JSON对象的stringify()和parse()方法。JSON.stringify(obj)将JSON转为字符串。JSON.parse(string)将字符串转为JSON格式;
2.2.5字符串转换JSON 对象
(1)可以在IE6、IE7、火狐(firefox)、360、google chrome、搜狗高速等浏览器中都可以用eval()将字符串转换为JSON对象或JSON.parse(string)将字符串转为JSON格式;这种形式;
如:1) <scripttype="text/javascript">
var c = '({ "name": "Mike", "sex": "女?", "age": "29" })';
var b = eval(c);
alert(b.name);
</script>
2) <script type="text/javascript">
var c = '{ "name": "Mike", "sex": "女?", "age": "29" }';
var b = eval("("+c+")");
alert(b.name);
</script>
3) <scripttype="text/javascript">
var c = '{ "name": "Mike", "sex": "女?", "age": "29" }';
var b = JSON.parse(b);
alert(b.name);
</script>
输出结果是:
2.2.6 JSON 对象转换字符串
如: <script type="text/javascript">
var people ={
"programmers":[{ "firstName": "Brett", "lastname": "Mclaughlin", "Email": "aaa" },
{"firstName":"Jason", "lastname":"Hunter", "Email":"bbb" },
{"firstName":"Elliotte", "lastname":"Harold", "Email":"ccc" }],
"authors": [{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }],
"musicians": [{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
]}
var strPeople = JSON.stringify(people);
alert(strPeople);
</script>
输入的结果是:
2.3基础结构
2.3.1“名称/值”对的集合(A collection of name/value pairs)。
不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(deyed list),或者关联数组(assocative array)。
2.3.2值的有序列表(An ordered list of values)。
大部分语言中,它被理解为数组(array)。
2.4 基础示例
JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
2.4.1表示名称 / 值对
按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对":
{ "firstName": "Brett" }
当将多个"名称 / 值对"串在一起时,JSON 就会体现出它的价值了。首先,可以创建包含多个"名称 / 值对"的 记录,比如:
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }
2.4.2表示数组
当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。例如,假设您希望表示一个人名列表。在 XML 中,需要许多开始标记和结束标记;如果使用典型的名称 / 值对,那么必须建立一种专有的数据格式,或者将键名称修改为 person1-firstName这样的形式。
如果使用 JSON,就只需将多个带花括号的记录分组在一起:
{ "people": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
]}
在这个示例中,只有一个名为 people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录):
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] }
2.5 JSON优缺点
2.5.1优点
(1)数据格式比较简单,易于读写,格式都是压缩的,占用带宽小。
(2)易于解析这种语言, 客户端JavaScript可以简单的通过eval()进行JSON数据的读取
(3)作为一种数据传输格式,JSON 与 XML 很相似,但是它更加灵巧。
(4 )JSON不需要从服务器端发送含有特定内容类型的首部信息。
支持多种语言,
2.5.2缺点
(1)语法过于严谨
(2)码不易读
(3)eval 函数存在风险
2.5.3JSON和 XML 优缺点的比较
(1) 在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
(2) 在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
(3) 在编码难度方面,XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
(4) 在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
(5) 在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。
(6) JSON和XML同样拥有丰富的解析手段。
(7) JSON相对于XML来讲,数据的体积小。
(8) JSON与JavaScript的交互更加方便。
(9) JSON对数据的描述性比XML较差。
(10) JSON的速度要远远快于XML。
2.6代码
<script type="text/javascript">
var people = { "programmers": [{ "firstName": "Brett", "lastname": "Mclaughlin", "Email": "aaa" },
{ "firstName": "Jason", "lastname": "Hunter", "Email": "bbb" },
{ "firstName": "Elliotte", "lastname": "Harold", "Email": "ccc" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
]
}
document.write(people.programmers[0].lastname);
</script>