本文为个人读书笔记,大部分为书中内容摘要。仅供记录和分享学习中遇到的需要留意的问题,如有相关版权问题请及时通知作者。
概述
JavaScript Object Notation
JSON是JS对象的一种标签。使用JSON对象可以方便地为字符串来进行存储和转换。
对象在JSON里是以普通JS代码表示的,因此可以利用JS的自动解析功能,让JS把JSON字符串的内容解释为代码,而不需要其他的解释程序或转换器。
JSON语法
JSON数据的表示方式是一系列成对的参数与值,参数与值由冒号分隔,每对之间以逗号分隔
“param1”:“value1”,“param2”:“value2”;
最终这些序列用花括号包装起来,构成表示数据的JSON对象
var jsonObject={“param1”:“value1”,“param2”:“value2” }
jsonObject的定义使用标准JavaScript标签的子集,就是标准的JavaScript代码。
使用JSON标签编写的对象也具有属性和方法,能够利用句点标签进行访问:
alert(jsonObject.param1);
任何能够以键值对表示的数据都能够用JSON标签表示。
访问JSON数据
还原以JSON字符串编码的数据,需要把字符串转换为JS代码,这一过程成为“去序列化”。
eval()
可以把JSON字符串转换为JS对象
var myObject=eval(‘(‘+jsonObjectString+’)’);
然后就可以在脚本里使用这个JavaScript对象
JS的eval()函数会计算或运行作为参数传递的内容。如果参数是个表达式eval()会计算它的值。如果参数包含一个或多个JS语句,eval()执行这些语句
使用浏览器对JSON直接支持
较新的浏览器,会创建一个名为JSON的JS对象来管理JSON的编码和解码。这个对象有两个方法:stringify()和parse()
JSON.parse()
用于解释JSON字符串。接收一个字符串作为参数,解析它,创建一个对象,并且根据字符串里发现的键值对设置对象的参数
JSON的数据序列化
序列化:把数据转换为便于通过网络进行存储和传输的形式,稍后再回复为原始的格式。
JSON使用字符串最为序列化数据的格式。
在直接支持JSON的浏览器里,可以使用JSON.stringify()方法创建对象的JSON编码字符串。
JSON数据类型
键值对里的参数部分的语法规则:不能是关键字,不能以数字开头,除了下划线和美元符号不能包含其他特殊字符。
可以是以下数据类型:数值、字符串、布尔值、数组、对象、null。(不包括Date、Error、Math、Fuction)
模拟关联数组
JavaScript不支持关联数组。(使用文本形式索引)
JS中object[property]和object.property是相同的语法。
使用JSON创建对象
虽然JSON是为了描述JavaScript对象而开发的,但它是独立于编程语言和平台的,Java、PHP、C等都包含JSON库和工具。
属性
用JSON标签表示对象时,把对象包含在花括号里,而不是方括号里,以“参数”:“值”对的方式列出对象的属性。
var user={
"username":"philb1234",
"location":"Spain"}
之后就可以用常见的形式访问对象的属性
JSON创建空对象:var myObject={ }
方法
利用匿名函数就可以给对象添加方法
var user={
"username":"philb1234",
"setName":fuction(newName){
this.username=newName;
}
}
然后就可以调用这个setName方法了。
在JS环境中使用这种方式添加方法是可以的,但当JSON作为通用数据交换格式时,不可以。直接支持JSON解析的浏览器里,以这种方式声明的函数会解析错误,但eval()函数可用。如果实例化的脚本只在自己的脚本里使用,是可以的。
数组
属性值可以是数组。使用object.property[index]访问
对象
JSON对象还可以包含其他对象。通过把数组元素本身设置为JSON编码的对象,就可以利用句点标签访问。
var booklistobject={
“booklist”:[{"title":"A1","author":"B1"},
{"title":"A2","author":B2"}]
}
调用:alert(bookListObject.booklist[0].author);
JSON安全性
使用JS的eval()函数能够执行任何JS命令,这可能会导致潜在的安全问题,特别是处理来源不明的JSON数据时。更安全的办法是使用内置JSON解析器的浏览器吧JSON字符串转换为JS对象,它只识别JSON文本,而且不会执行脚本命令。内置JSON解析器的速度也比eval()快一些。ECMAScript(JavaScript)标准也明确了 它的规范。
JSON规范文档
RFC 4627和JSON官网
如何判断使用的浏览器 是否直接支持JSON
if(typeof Json=='object'){
//直接支持
}else{
//用其他方式解决,如eval()
}