`
chaoyi
  • 浏览: 309619 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

第三十二章 JSON

 
阅读更多

学习要点:
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);

 

分享到:
评论

相关推荐

    第32章 JSON1

    对于不支持 `JSON` 对象的旧版浏览器,可以通过第三方库如 json.js 来实现 JSON 功能的模拟。JSON 的广泛应用在于它能够在多种编程语言之间进行数据交换,包括但不限于 JavaScript、Python、Ruby、Java 等。 示例:...

    疯狂Android讲义第二版光盘源码(第十一章到十五章)

    2. **第十二章:多媒体处理** - 学习如何处理音频、视频和图像,包括播放本地和在线媒体资源,捕获和编辑多媒体数据。 - 源码可能包含使用MediaPlayer、SurfaceView或TextureView播放视频,使用Camera API进行拍照...

    android知识大总结【邯院】

    第三章 电话拨号器和发送短信小程序 12 第四章 日志输出和单元测试 17 第五章 数据的存储与访问 19 第六章 SD卡的存取和XML读取 24 第七章 SharedPreferences进行数据存储 38 第八章 SQLITE数据库 42 第九章 ...

    Android开发权威指南 第2版 随书源代码(全45章)

    第三十二章至第三十五章,探讨了Android中的各种动画效果,如属性动画、帧动画和过渡动画。源代码包含了实现平移、旋转、缩放等各种动画效果的实例。 十一、性能优化与测试 第三十六章至第四十五章,讲解了性能优化...

    C#入门经典(第四版)第32章 网络

    ### C#入门经典(第四版)第32章 网络 #### 知识点概览 在《C#入门经典(第四版)》这本书的第32章中,作者详细介绍了C#语言在网络编程方面的应用。网络编程是软件开发中的一个重要分支,涉及到客户端与服务器之间...

    疯狂ajax 讲义 第三版 源码 12章

    源码文件“12章”可能代表书籍第十二章的内容,这一章通常会涉及到更高级或者特定的主题,例如Ajax的安全性、性能优化,或者是与服务器端通信的高级技巧。在这一章中,读者可能会学到如何处理跨域请求、如何使用缓存...

    疯狂Android讲义第二版光盘源码(第十六到十九章)

    Android应用常常需要与服务器进行数据交换,这章会介绍HTTP请求的基本原理,如使用HttpURLConnection或者第三方库如OkHttp进行网络请求。同时,还会涉及到JSON数据的解析,如何使用Gson或Jackson库将数据转换为Java...

    使用rails6 开发纯后端 API 项目

    书中实现了一个简易商城系统的 纯后台 API 项目!适用于目前流行的使**用http或https...- 第十二章:项目优化 - 第十三章:项目部署 前两章是开发的准备工作,从第三章开始进入项目开发阶段,按照用户、商铺、商品、

    《Android应用程序开发与典型案例》1-12章

    第十二章可能涵盖网络编程和数据同步,讲解如何使用HttpURLConnection、OkHttp等库进行HTTP请求,以及处理JSON或XML数据,实现网络数据的获取和发送。 总的来说,这个压缩包中的资料全面覆盖了Android开发的基础...

    《Flash.ActionScript3殿堂之路》1-26章完整版

    在第一部分的后半段,第八章至第十二章,书中将介绍更多高级主题,如包、命名空间、错误处理和调试技巧,这些对于编写可维护和可靠的代码非常关键。此外,还将探讨时间轴控制,使开发者能够灵活地管理动画和帧序列。...

    Asp.net 3.5 Unleashed 第31章到34章的源码及数据库文件 非Chm格式的

    ### 第32章:AJAX与ASP.NET AJAX 此章重点讨论了如何使用ASP.NET AJAX技术实现异步Web应用: 1. **UpdatePanel** - UpdatePanel组件使得页面的部分区域可以异步更新,无需整个页面刷新。 2. **ScriptManager** -...

    PHP完全自学手册光盘源代码1

    通过第三章和第四章,我们可以了解到如何定义和使用自定义函数,以及如何使用参数和返回值。 3. **面向对象编程**:第五章至第七章涉及面向对象的概念,如类的定义、对象的创建、属性与方法、继承、封装和多态性。...

    VC开发经验技巧 共分为21章 第十七章

    11. 库和API的使用:如何集成和使用第三方库,如Boost、OpenGL、DirectX等,以及Windows API函数。 12. 版本控制:使用Git或其他版本控制系统进行代码版本管理和协同开发。 13. 构建系统:了解MSBuild或CMake等...

    Ajax编程技术PPT资料打包

    第三章 Ajax和服务器端技术 第四章 Ajax技术 第五章 XML要点 第六章 调试与错误处理 第七章 Web服务、API和Mashup 第八章 XSLT和XPath 第九章 常见问题解决模式 第十章 使用外部数据 第十一章 JSON

    EXT核心API详解 19章

    第九章至第十二章,重点可能是EXT的数据管理,包括数据存储(Store)、记录模型(Record)、数据字段(Field)和数据代理(Proxy)。这部分会阐述如何从服务器加载数据,以及如何将数据绑定到组件上,实现数据的动态...

    ACCP6.0使用javascript增强交互效果第三章课后习题答案

    本章节聚焦于如何利用JavaScript来提升用户体验,通过解决第三章的课后习题,我们可以深入理解并掌握其核心概念。 一、变量与数据类型 JavaScript支持多种数据类型,包括基本类型(如字符串、数字、布尔值、null和...

    JAVA WEB开发源码

    3. **第三章:JSP** - JSP(JavaServer Pages)用于动态网页生成,讲解JSP语法、EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)。 4. **第四章:MVC模式** - 介绍Model-View-...

    第四章 第二节:后端服务开发.pdf

    • 第三节:前端服务开发体验 • 系统应用前端开发详解 3 STM32-阿里云IoT 联合课件开发 第四章 . 第二节 后端服务开发 第四章.第二节 内容简介 • 认识后端框架 • Mysql数据库介绍 • MyBatis框架 • SpringBoot...

    疯狂ajax源代码第13-15章

    在IT领域,Ajax(Asynchronous ...通过14、15、13这三章的源代码,读者可以亲手实践书中提到的示例,进一步巩固理论知识,提升编程技能。这不仅有助于理解Ajax技术,也为后续学习更复杂前端技术和框架打下坚实基础。

    C#程序开发范例宝典1(共20章)

    - **第三章:类与对象** - 介绍面向对象编程的核心概念,包括类的定义、对象的创建和销毁,以及封装、继承和多态的概念。 - **第四章:接口与抽象类** - 探讨接口的使用和抽象类的设计,以及它们在多态性中的作用...

Global site tag (gtag.js) - Google Analytics