JavaScript之JSON
来源:互联网 发布:淘宝开通企业店铺 编辑:程序博客网 时间:2024/06/06 02:10
JSON是JavaScript一个严格的子集,它利用了JavaScript中的模式表示结构化数据。JSON可以直接传给eval(),而不必创建DOM对象(不必声明变量)。
注:JSON是一种数据格式,不是编程语言。JSON不是JavaScript独有的。
什么是JSON:
- JSON是JavaScript对象表示法
- JSON是轻量级的文本数据交换格式
- JSON具有独立性,不是JavaScript独有的。
- JSON具有自我供述性、更容易理解。
语法
JSON的语法可以表示以下三种类型的值:
- 简单值,与JavaScript语法相似,可以表示数字值、字符串值、布尔值和null,但JSON不能表示undefined。
- 对象,与JavaScript中的对象相似。
- 数组,与JavaScript中的数组相似。
注:JSON不支持变量,函数或对象实例,它只是一种表示结构化数据的格式。因此,JSON没有声明变量一说,三种类型的值直接书写就是。
简单值
JSON支持数字值、字符串、布尔值和null。
在JavaScript中表示这三种类型的值可以是这样的:
var a = 1234, //表示数字值b = "hello JSON", //表示字符串,用双引号c = "hello JavaScript", //表示字符串,用单引号d = true; //表示布尔值
而在JSON是这样表示这三种类型的值的:
1234"hello JSON""hello JavaScript"true
从上述两个例子,我们可以看出JavaScript与JSON的两个不同点:
- JavaScript需要声明变量用来保存这三种类型的值,也就是说需要声明变量并初始化变量,且每个语句后面必须有分号表示。而JSON因为不支持变量,所以无需声明变量,直接书写值,并传递给eval(),并且JSON不加分号。
- JavaScript字符串与JSON字符串的最大区别在于,JavaScript的字符串可以用双引号表示,也可以用单引号表示。但JSON的字符串必须用双引号表示,否则会报错。
对象
JSON的对象与JavaScript字面量对象有一点不同,在JavaScript中表示字面量对象:
var obj = { name : "tom", age : 21, sayName : function () { alert(this.name); }};
在JavaScript中,属性名也可以添加双引用表示:
var obj = { “name” : "tom", “age” : 21, “sayName” : function () { alert(this.name); }};
而在JSON中,没有声明变量这一操作(不支持变量),属性名必须用双引用,且末尾没有分号,注:花括号是有的
{ "name" : "tom", "age" : 21, "sayName" : function () { alert(this.name); }}
再次声明:JSON对象或字符串中,属性名或字符串必须添加双引用。
数组
JSON数组就是采用JavaScript的字面量形式,在JavaScript中的字面量数组:
var arr = [21, "tom", true];
而在JSON中的字面量数组:
[21, "tom", true]
可以看出,JSON中的字面量数组,没有声明变量这一操作,且末尾没有分号。
解析与序列化
JSON可以把JSON数据结构解析为JavaScript对象。
JSON对象
JSON对象有两个方法,分别是stringify()和parse()。在最简单的情况下,它们分别可以将JavaScript对象序列化为JSON字符串和将JSON字符串解析成JavaScript值。
例如:
var book = { title : "a good book", authors : "zhang", edition : 3, year : 2017};//将JavaScript对象序列化为JSON字符串,并将其保存在变量jsonText中var jsonText = JSON.stringify(book);
JSON.stringify()将JavaScript对象序列化为JSON字符串,默认情况下(在没有传入参数的情况下),输出的JSON字符串不包含任何空格和缩进,此时输出的JSON字符串为:
{"title":"a good book","authors":"zhang","edition":3,"year":2017}
除了原字符串间的空格,其它的空格和缩进均被删除了。
注:在序列化JavaScript对象时,所有的函数和原型成员会被有意忽略。值为undefined的任何属性也会被跳过。
将JSON字符串传递给JSON.parse()会得到相应的JavaScript值。
var javaScriptText = JSON.parse(jsonText);
注:book与javaScriptText虽然有相同的属性,但它们是相互独立、没有任何关系的对象。如果传递给JSON.parse()的不是有效的JSON字符,则会报错。
序列化选项
JSON.parse()方法可以接收三个参数:第一个参数就是要序列化的JavaScript对象,第二个参数是个过滤器,可以是一个数组,也可以是一个函数,第三个参数是个选项,表示是否在JSON字符串中保留空格和缩进。
过滤结果
var book = { title : "a good book", authors : "zhang", edition : 3, year : 2017};//数组中列出的属性是title、year,那么JSON字符串中只保留这两个属性及属性值。var jsonText = JSON.stringify(book, ["title", "year"]);
JSON.parse()输出的结果为:
{"title":"a good book","year":2017}
结果中只保留了"title"和"year"这两个属性。
如果第二个参数是一个函数,那么此函数接收两个参数:属性名和属性值,根据属性名可以知道如何处理要序列化的对象中的属性。
JSON字符串缩进
JSON.stringify*()方法中的第三个参数用于控制结果中的空格和缩进。
如果是参数数值,注:最大缩进数为10,如果设置的缩进数大于10,则转换成10。
var book = { title : "a good book", authors : "zhang", edition : 3, year : 2017};//结果中以4为缩进数var jsonText = JSON.stringify(book, [book, null, 4]);
输出结果:
{ title : "a good book", authors : "zhang", edition : 3, year : 2017}
字符间的缩进数为4,当设置有效的缩进参数时,那么结果中也会包含换行符,如果只有缩进而无换行,那么缩进也没有多大意义。
当第三个参数(缩进参数)不是数字,而是其它字符时,那么就以此字符中缩进,如:
var book = { title : "a good book", authors : "zhang", edition : 3, year : 2017};//结果中以"--"为缩进数var jsonText = JSON.stringify(book, [book, null, "--"]);
输出结果:
{--title : "a good book",--authors : "zhang",--edition : 3,--year : 2017}
"--"代替了缩进空格。至于换行,则是因为有效的缩进"--"的结果。
注:同理,当以字符为缩进参数时,字符的长度也不能超过10个字符,如果超过10个字符,那么只显示前10个字符。
toJSON()方法
toJSON()方法返回自身的JSON数据格式。如果对象中有这个方法,则优先执行该方法,且能通过它取得有效值的话,返回该方法的值。执行完这个方法后,才开始序列化对象。
可以为任何对象添加toJSON()方法:
var book = { title : "a good book", authors : "zhang", edition : 3, year : 2017 toJSON : function () { return this.title; }};var jsonText = JSON.stringify(book, [book]);
此对象定义了一个toJSON()方法,返回"title"的值。那么这个对象将被序列化为一个字符串而非对象了。可以让toJSON()方法返回任何值,它才能正常工作。
理解序列化的内部顺序:
- 如果对象中有toJSON()方法,且通过它能取得有效的值,则调用该方法,否则返回对象本身。
- 如果提供了第二个参数,应用这个函数过滤器,传入过滤器的值是上一步返回的值。
- 将上一步返回的每个值序列化。
- 如果有第三参数,则进行相应的格式化。
解析选项
JSON.parse()方法接收两个参数:第一个参数是JSON字符串,第二个参数是一个还原函数,与JSON.stringify()方法的过滤器的签名是相同的--接收两个参数,即属性名和属性值。
总结
JSON的特点:
- JSON是纯文本
- JSON具有层次结构(值中有值)
- JSON可通过JavaScript的eval()解析
- JSON可被Ajax传输
- JSON具有自我描述性
JSON与XML的不同之处:
- 没有结束标签
- 更短
- 读写速度更快
- 可被JavaScript的eval()解析
- 使用数组
- 不使用保留字
为什么JSON比XML的读写速度更快:
使用XML:
- 读取XML文档
- 使用XML DOM来循环遍历文档
- 读取值并保存在变量中
- 读取JSON字符串
- 使用eval()处理JSON字符
- JavaScript之JSON详解
- JavaScript之JSON详解
- JavaScript之JSON详解
- javascript 之 Math JSON
- JavaScript之JSON
- JavaScript之JSON详解
- javascript 之 Math JSON
- javascript之JSON引入
- JavaScript之JSON用法
- JavaScript之JSON
- javascript之JSON对象
- JavaScript基础之JSON
- JSON详细学习之JSON in JavaScript
- JavaScript知识点之JSON.parse
- JavaScript 面向对象之JSON
- JavaScript入门之对象与JSON
- JavaScript入门之对象与JSON篇
- JavaScript之——JSON总结
- 最长公共子序列(LCS)
- 复习
- 整合SSH开发环境准备
- Java继承_概念与实现(一)
- POJ 1021 2D-Nim 笔记
- JavaScript之JSON
- github + hexo快速搭建属于自己的博客
- poj 1797 Heavy Transportation
- 数组有关的函数
- 根据消费金额判断优惠折扣
- 创业讲座笔记与心得
- 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel
- unix网络编程学习笔记(1)环境配置(CentOS)
- 简单的数学问题