学习要点:
1.JSON 语法
2.解析和序列化
前两章我们探讨了 XML 的结构化数据, 但开发人员还是觉得这种微型的数据结构还是过于烦琐、冗长。为了解决这个问题,JSON 的结构化数据出现了。JSON 是 JavaScript 的一个严格的子集,利用 JavaScript 中的一些模式来表示结构化数据。
一.JSON 语法
JSON 和 XML 类型,都是一种结构化的数据表示方式。所以,JSON 并不是 JavaScript独有的数据格式,其他很多语言都可以对 JSON 进行解析和序列化。
JSON 的语法可以表示三种类型的值:
1.简单值: 可以在 JSON 中表示字符串、 数值、 布尔值和 null。 但 JSON 不支持 JavaScript中的特殊值 undefined。
2.对象:顾名思义。
3.数组:顾名思义。
简单值
100、"Lee" 这两个量就是 JSON 的表示方法, 一个是 JSON 数值, 一个是 JSON 字符串。
布尔值和 null 也是有效的形式。但实际运用中要结合对象或数组。
对象
JavaScript 对象字面量表示法:
var box = { name : 'Lee', age : 100 };
而 JSON 中的对象表示法需要加上双引号,并且不存在赋值运算和分号:
{ "name" : "Lee", //使用双引号,否则转换会出错 "age" : 100 }
数组
JavaScript 数组字面量表示法:
var box = [100, 'Lee', true];
而 JSON 中的数组表示法同样没有变量赋值和分号:
[100, "Lee", true] 一般比较常用的一种复杂形式是数组结合对象的形式: [ { "title" : "a", "num" : 1 }, { "title" : "b", "num" : 2 }, { "title" : "c", "num" : 3 } ]
PS:一般情况下,我们可以把 JSON 结构数据保存到一个文本文件里,然后通过XMLHttpRequest 对象去加载它,得到这串结构数据字符串(XMLHttpRequest 对象将在 Aajx章节中详细探讨)。所以,我们可以模拟这种过程。
模拟加载 JSON 文本文件的数据,并且赋值给变量。
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]';
PS; 上面这短代码模拟了 var box = load('demo.json');赋值过程。 因为通过 load 加载的文本文件,不管内容是什么,都必须是字符串。所以两边要加上双引号。
其实 JSON 就是比普通数组多了两边的双引号,普通数组如下:
var box = [{name : 'a', age : 1},{name : 'b', age : 2}];
二.解析和序列化
如果是载入的 JSON 文件, 我们需要对其进行使用, 那么就必须对 JSON 字符串解析成原生的 JavaScript 值。当然,如果是原生的 JavaScript 对象或数组,也可以转换成 JSON 字符串。
对于讲 JSON 字符串解析为 JavaScript 原生值,早期采用的是 eval()函数。但这种方法既不安全,可能会执行一些恶意代码。
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]'; alert(box); //JSON 字符串 var json = eval(box); //使用 eval()函数解析 alert(json); //得到 JavaScript 原生值
ECMAScript5 对解析 JSON 的行为进行规范,定义了全局对象 JSON。支持这个对象的浏览器有 IE8+、 Firefox3.5+、Safari4+、Chrome 和 Opera10.5+。不支持的浏览器也可以通过一个开源库 json.js 来模拟执行。JSON 对象提供了两个方法,一个是将原生 JavaScript 值转换为 JSON 字符串:stringify();另一个是将 JSON 字符串转换为 JavaScript 原生值:parse()。
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]'; //特别注意,键要用双引号 alert(box); var json = JSON.parse(box); //不是双引号,会报错 alert(json); var box = [{name : 'a', age : 1},{name : 'b', age : 2}]; //JavaScript 原生值 var json = JSON.stringify(box); //转换成 JSON 字符串 alert(json); //自动双引号
在序列化 JSON 的过程中, stringify()方法还提供了第二个参数。 第一个参数可以是一个数组, 也可以是一个函数, 用于过滤结果。 第二个参数则表示是否在 JSON 字符串中保留缩进。
var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}]; var json = JSON.stringify(box, ['name', 'age'], 4); alert(json);
PS:如果不需要保留缩进,则不填即可;如果不需要过滤结果,但又要保留缩进,则讲过滤结果的参数设置为 null。如果采用函数,可以进行复杂的过滤。
var box = [{name : 'a', age : 1, height : 177},{name : 'b', age : 2, height : 188}]; var json = JSON.stringify(box, function (key, value) { switch (key) { case 'name' : return 'Mr. ' + value; case 'age' : return value + '岁'; default : return value; } }, 4); alert(json);
PS:保留缩进除了是普通的数字,也可以是字符。
还有一种方法可以自定义过滤一些数据,使用 toJSON()方法,可以将某一组对象里指定返回某个值。
var box = [{name : 'a', age : 1, height : 177, toJSON : function () { return this.name; }},{name : 'b',age : 2, height : 188, toJSON : function () { return this.name; }}]; var json = JSON.stringify(box); alert(json);
PS:由此可见序列化也有执行顺序,首先先执行 toJSON()方法;如果应用了第二个过滤参数,则执行这个方法;然后执行序列化过程,比如将键值对组成合法的 JSON 字符串,比如加上双引号。如果提供了缩进,再执行缩进操作。
解析 JSON 字符串方法 parse()也可以接受第二个参数,这样可以在还原出 JavaScript 值的时候替换成自己想要的值。
var box = '[{"name" : "a","age" : 1},{"name" : "b","age" : 2}]'; var json = JSON.parse(box, function (key, value) { if (key == 'name') { return 'Mr. ' + value; } else { return value; } }); alert(json[0].name);
相关推荐
对于不支持 `JSON` 对象的旧版浏览器,可以通过第三方库如 json.js 来实现 JSON 功能的模拟。JSON 的广泛应用在于它能够在多种编程语言之间进行数据交换,包括但不限于 JavaScript、Python、Ruby、Java 等。 示例:...
2. **第十二章:多媒体处理** - 学习如何处理音频、视频和图像,包括播放本地和在线媒体资源,捕获和编辑多媒体数据。 - 源码可能包含使用MediaPlayer、SurfaceView或TextureView播放视频,使用Camera API进行拍照...
第三章 电话拨号器和发送短信小程序 12 第四章 日志输出和单元测试 17 第五章 数据的存储与访问 19 第六章 SD卡的存取和XML读取 24 第七章 SharedPreferences进行数据存储 38 第八章 SQLITE数据库 42 第九章 ...
第三十二章至第三十五章,探讨了Android中的各种动画效果,如属性动画、帧动画和过渡动画。源代码包含了实现平移、旋转、缩放等各种动画效果的实例。 十一、性能优化与测试 第三十六章至第四十五章,讲解了性能优化...
### C#入门经典(第四版)第32章 网络 #### 知识点概览 在《C#入门经典(第四版)》这本书的第32章中,作者详细介绍了C#语言在网络编程方面的应用。网络编程是软件开发中的一个重要分支,涉及到客户端与服务器之间...
源码文件“12章”可能代表书籍第十二章的内容,这一章通常会涉及到更高级或者特定的主题,例如Ajax的安全性、性能优化,或者是与服务器端通信的高级技巧。在这一章中,读者可能会学到如何处理跨域请求、如何使用缓存...
Android应用常常需要与服务器进行数据交换,这章会介绍HTTP请求的基本原理,如使用HttpURLConnection或者第三方库如OkHttp进行网络请求。同时,还会涉及到JSON数据的解析,如何使用Gson或Jackson库将数据转换为Java...
书中实现了一个简易商城系统的 纯后台 API 项目!适用于目前流行的使**用http或https...- 第十二章:项目优化 - 第十三章:项目部署 前两章是开发的准备工作,从第三章开始进入项目开发阶段,按照用户、商铺、商品、
第十二章可能涵盖网络编程和数据同步,讲解如何使用HttpURLConnection、OkHttp等库进行HTTP请求,以及处理JSON或XML数据,实现网络数据的获取和发送。 总的来说,这个压缩包中的资料全面覆盖了Android开发的基础...
在第一部分的后半段,第八章至第十二章,书中将介绍更多高级主题,如包、命名空间、错误处理和调试技巧,这些对于编写可维护和可靠的代码非常关键。此外,还将探讨时间轴控制,使开发者能够灵活地管理动画和帧序列。...
### 第32章:AJAX与ASP.NET AJAX 此章重点讨论了如何使用ASP.NET AJAX技术实现异步Web应用: 1. **UpdatePanel** - UpdatePanel组件使得页面的部分区域可以异步更新,无需整个页面刷新。 2. **ScriptManager** -...
通过第三章和第四章,我们可以了解到如何定义和使用自定义函数,以及如何使用参数和返回值。 3. **面向对象编程**:第五章至第七章涉及面向对象的概念,如类的定义、对象的创建、属性与方法、继承、封装和多态性。...
11. 库和API的使用:如何集成和使用第三方库,如Boost、OpenGL、DirectX等,以及Windows API函数。 12. 版本控制:使用Git或其他版本控制系统进行代码版本管理和协同开发。 13. 构建系统:了解MSBuild或CMake等...
第三章 Ajax和服务器端技术 第四章 Ajax技术 第五章 XML要点 第六章 调试与错误处理 第七章 Web服务、API和Mashup 第八章 XSLT和XPath 第九章 常见问题解决模式 第十章 使用外部数据 第十一章 JSON
第九章至第十二章,重点可能是EXT的数据管理,包括数据存储(Store)、记录模型(Record)、数据字段(Field)和数据代理(Proxy)。这部分会阐述如何从服务器加载数据,以及如何将数据绑定到组件上,实现数据的动态...
本章节聚焦于如何利用JavaScript来提升用户体验,通过解决第三章的课后习题,我们可以深入理解并掌握其核心概念。 一、变量与数据类型 JavaScript支持多种数据类型,包括基本类型(如字符串、数字、布尔值、null和...
3. **第三章:JSP** - JSP(JavaServer Pages)用于动态网页生成,讲解JSP语法、EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)。 4. **第四章:MVC模式** - 介绍Model-View-...
• 第三节:前端服务开发体验 • 系统应用前端开发详解 3 STM32-阿里云IoT 联合课件开发 第四章 . 第二节 后端服务开发 第四章.第二节 内容简介 • 认识后端框架 • Mysql数据库介绍 • MyBatis框架 • SpringBoot...
在IT领域,Ajax(Asynchronous ...通过14、15、13这三章的源代码,读者可以亲手实践书中提到的示例,进一步巩固理论知识,提升编程技能。这不仅有助于理解Ajax技术,也为后续学习更复杂前端技术和框架打下坚实基础。
- **第三章:类与对象** - 介绍面向对象编程的核心概念,包括类的定义、对象的创建和销毁,以及封装、继承和多态的概念。 - **第四章:接口与抽象类** - 探讨接口的使用和抽象类的设计,以及它们在多态性中的作用...