JavaScript高级程序设计:第二十章

第二十章

一、语法

JSON的语法可以表示以下三种类型的值:

(1)简单值

(2)对象

JSON的对象与javascript字面量有一些不同。例如,在javascript中,前面的对象字面量可以写成下面这样:

var  object = {

“name” : “Nicholas” ,

“age” : 29

} ;

JSON表示上述对象的方式如下:

{

“name” : “Nicholas” ,

“age” : 29

}

不同之处:首先,没有声明变量,其次,没有末尾的分号。最后,对象的属性必须加双引号。

(3)数组

下面是javascript中的数组字面量:

var  values = [25 , “hi” , true] ;

在JSON中,可以采用同样的语法表示同一个数组:

[]25 , “hi” , true]

同样,JSON数组也没有变量和分号。

二、解析与序列化

1.JSON对象

早期的JSON解析器基本上就是使用javascript的eval()函数。由于JSON是javascript语法的子集,因此eval()函数可以解析、解释并返回javascript对象和数组。

JSON对象有两个方法:stringgy( )和parse( )。在最简单的情况下,这两个方法分别用于把javascript对象序列化为JSON字符串和把JSON字符串解析为原生javascript值。

2.序列化选项

JSON.stringify( )除了要序列化的javascript对象外,还可以接收另外两个参数,这两个参数用于指定以不同的方式序列化javascript对象。第一个参数是过滤器,可以是一个数组,也可以是一个函数;第二个参数是一个选项,表示是否在JSON字符串中保留缩进。

(1)过滤结果

如果过滤器参数是数组,那么JSON.stringify( )的结果中将只包含数组中列出的属性。来看下面的例子:

var  book = {

“title” : “Professional JavaScript” ,

“authors” : [

“Nicholas C.Zakas”] ,

edition : 3 , year : 2011

} ;

var jsonText = JSON.stringify( book , [“title” , “edition”] ) ;

JSON.stringify( ) 的第二个参数是一个数组,其中包含两个字符串:”title”和”editon”。这两个属性与将要序列化的对象中的属性是对应的,因此在返回的结果字符串中,就只会包含这两个属性:

{ “title” : “Professional  JavaScript” , “edition” : 3 }

(2)字符串缩进

JSON.stringify( )方法的第三个参数用于控制结果中的缩进和空白符。如果这个参数是一个数值,那它表示的是每个级别缩进的空格数。例如,要在每个级别缩进4个空格,可以这样写代码:

var  book = {

“title” : “Professional  JavaScript” ;

“authors” : [

“Nicholas  C . Zakas”

] ,

edition : 3 ,

year : 2011

} ;

var  jsonText = JSON.stringify( nook , null , 4 ) ;

(3)toJSON()方法

有时候,JSON.stringify( )还是不能满足对某些对象进行自定义序列化的需求。在这些情况下,可以通过对象上调用toJSON()方法,返回其自身的JSON数据格式。

toJSON( )可以作为函数过滤器的补充,因此理解序列化的内部顺序十分重要。假设把一个对象传入JSON.stringify( ),序列化该对象的顺序如下:

如果存在toJSON( )方法而且能通过它取得有效的值,则调用该方法。否则,按默认顺序执行序列化。

如果提供了第二个参数,应该用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。

对第(2)步返回的每个值进行相应的序列化。

如果提供了第三个参数,执行相应的格式化。

3.解析选项

JSON.parse( )方法也可以接收另一个参数,该参数是一个函数,将在每个键值对上调用。为了区别JSON.stringify( )接收的替换函数,这个函数被称为还原函数。

时间: 2024-10-19 09:16:45

JavaScript高级程序设计:第二十章的相关文章

《JavaScript高级程序设计 第二版》理解对象

声明:这类属于学习笔记,主要是摘录书中内容,比较少的整理.内容经常是跳跃的,建议您阅读书本,收益更大. ECMA-262把对象定义为“无序属性的集合,其属性可以包含基本值,对象或者函数” 对象时一组没有特定顺序的值,每个属性或方法都有一个名字,每个名字都映射一个值. 每个对象都是基于一个引用类型创建的,这个引用类型可以是第5章讨论的原生类型,也可以是开发人员定义的类型 常规的创建对象的方法是通过Object这个内置对象来进行创建出一个实例,然后再給其添加属性和方法 var person=new

Javascript高级程序设计——第二章:在HTML中使用Javascript

第二章:在HTML中使用Javascript <script>元素 向HTML页面中插入Javascript的主要方法,就是使用<script>元素,<script>元素有六个属性: async:可选.表示应该立即下载脚本,但不妨碍页面的其他操作,比如下载其他资源或等待加载其他脚本,只针对外部脚本有效. defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只针对外部脚本有效. src:可选.表示包含要执行代码的外部文件. type:可选.表示编写代码使用

读书笔记 - javascript 高级程序设计 - 第二章 在Html中使用JavaScript

1 <script>的6个属性 async  立即下载当前script标签的外部脚本 但不能影响别的 charset 没用了 defer  文档显示之后再执行脚本,只对外部脚本有效 language 没用了 src type 描述代码内容Mine类型 默认就是text/javascript 没什么用 2 在解释器对<script>元素内部的所有代码求值完毕以前 页面中的其余内容都不会被浏览器加载或显示 3 有两种script 嵌入式 外部引入式 在解析外部引入式的js文件时,页面的

javascript高级程序设计---第二、三章

在HTML中引用javaScript javascript的几个属性  type async(异步加载 只适用于外部JS且IE8以上 HTML5规范 先于load执行) src defer(延迟加载 只适用于外部加载 先于load执行) 在HTML中使用外部JS代码的优点,1.便于维护 ,2.可缓存.3.适应未来. 在javascript中区分变量的大小写 比如(test 和 Text是?的两个变量) 在ECMA5中新模式,严格模式  'use strict'在js代码中加入这句话即为严格模式

《JavaScript高级程序设计》(第二版)

这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量,他出的书都广受好评.这本书已经出了第二版,而且与第一版相比内 容更新很大,直接第二版就行.不要被书名的“高级”唬住,只要有JS基础语法知识和DOM基础知识就行,而且本书开始阶段还是介绍JS和DOM的语法知 识. 评论:重点推荐一下第五章(类型),第六章(OOP),第七章(匿名),多看几遍,至少要完全

《javascript高级程序设计》第二、三章知识点整理

第二章知识点总结 1.<script>在html中的使用 主要功能:在页面中嵌入javascript代码或包含外部javascript文件. 常用属性: type:用于定义脚步代码的语言类型,默认为text/javascript. src:包含外部域的javascript文件. defer:表示脚本会在整个页面加载完毕之后运行,只对外部文件有效,最好只包含一个延迟脚本. async:脚本在不妨碍其他操作的情况下立即下载(不保证下载文件的顺序). 插入位置:在页面<body>标签页面

javascript高级程序设计 第十四章--表单脚本

javascript高级程序设计 第十四章--表单脚本 在HTML中表单由<form>元素表示,在js中表单对应的是HTMLFormElement类型,这个类型也有很多属性和方法:取得表单元素的引用还是为它添加id特性,用DOM操作来获取表单元素:提交表单:把<input>或<button>元素的type特性设置为"submit",图像按钮把<input>元素的type特性设置为"image",也可以调用submit(

javascript高级程序设计 第十三章--事件

javascript高级程序设计 第十三章--事件js与HTML的交互就是通过事件实现的,事件就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流:事件流描述的是从页面中接收事件的顺序,IE的是事件冒泡流,Netscape的是事件捕获流,这个两个是完全相反的事件流概念. 事件冒泡:由最具体的元素接收,然后逐级向上传播到更高级的节点,即事件沿DOM树向上传播,直到document对象. 事件捕获:不大具体的节点应该更早接收到事件,相当于沿DOM节点树向下级传播直到事件的实际目标,在浏览器中,是

javascript高级程序设计 第九章-- 客户端检测

javascript高级程序设计 第九章-- 客户端检测 客户端检测是javascript开发中最具争议的一个话题,由于浏览器间存在差别,通常需要根据不同浏览器的能力分别编写不同的代码.有下列常使用的客户端检测方法:能力检测:在编写代码之前先检测特定浏览器的能力.例如,脚本在调用某个函数之前,可能要先检测该函数是否存在.这种检测方法将开发人员从考虑具体的浏览器类型和版本中解放出来,让他们把注意力集中到相应的能力是否存在上.能力检测无法精确地检测特定的浏览器和版本.怪癖检测:怪癖实际上是浏览器中存

《JavaScript高级程序设计》学习笔记(5)——面向对象编程

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数.