JavaScript高级程序设计学习笔记第二十章--JSON

1.JSON:JavaScript Object Notation, JavaScript 对象表示法。

2.最重要的是要理解它是一种数据格式,不是一种编程语言。虽然具有相同的语法形式,但 JSON 并不从属于 JavaScript。而且,并不是只有 JavaScript 才使用 JSON,毕竟 JSON 只是一种数据格式。很多编程语言都有针对 JSON 的解析器和序列化器。

3.语法:

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

  • 简单值:使用与 JavaScript 相同的语法,可以在 JSON 中表示字符串、数值、布尔值和 null。但 JSON 不支持 JavaScript 中的特殊值 undefined。

    • JavaScript 字符串与 JSON 字符串的最大区别在于, JSON 字符串必须使用双引号(单引号会导致语法错误)。
  • 对象:对象作为一种复杂数据类型,表示的是一组无序的键值对儿。而每个键值对儿中的值可以是简单值,也可以是复杂数据类型的值。

    • 与 JavaScript 的对象字面量相比, JSON 对象有两个地方不一样。首先,没有声明变量(JSON 中没有变量的概念)。其次,没有末尾的分号(因为这不是 JavaScript 语句,所以不需要分号)。再说一遍,对象的属性必须加双引号,这在 JSON 中是必需的。属性的值可以是简单值,也可以是复杂类型值。例如:
    •  1 //javascript对象字面量
       2 var person = {
       3 name: "Nicholas",
       4 age: 29
       5 };
       6 //JSON变量
       7 {
       8 "name": "Nicholas",
       9 "age": 29
      10 }
  • 数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值。数组的值也可以是任意类型——简单值、对象或数组。

    • JSON 数组没有变量和分号,例如:
    • 1 //JavaScript 中的数组字面量
      2 var values = [25, "hi", true];
      3 
      4 //JSON表示数组
      5 [25, "hi", true]
  • JSON 不支持变量、函数或对象实例

 

解析与序列化:

JSON 之所以流行,更重要的一个原因是,可以把JSON 数据结构解析为有用的 JavaScript 对象。

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

序列化:

例如:

 1 var book = {
 2 title: "Professional JavaScript",
 3 authors: [
 4 "Nicholas C. Zakas"
 5 ],
 6 edition: 3,
 7 year: 2011
 8 };
 9 var jsonText = JSON.stringify(book);//{"title":"Professional JavaScript","authors":["Nicholas C. Zakas"],"edition":3,
10 "year":2011}

在序列化 JavaScript 对象时,所有函数及原型成员都会被有意忽略,不体现在结果中。此外,值为undefined 的任何属性也都会被跳过。

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

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

1 var book = {
2 "title": "Professional JavaScript",
3 "authors": [
4 "Nicholas C. Zakas"
5 ],
6 edition: 3,
7 year: 2011
8 };
9 var jsonText = JSON.stringify(book, ["title", "edition"]);//{"title":"Professional JavaScript","edition":3}

 

如果第二个参数是函数,行为会稍有不同。传入的函数接收两个参数,属性(键)名和属性值。根据属性(键)名可以知道应该如何处理要序列化的对象中的属性。属性名只能是字符串,而在值并非键值对儿结构的值时,键名可以是空字符串。例如:

 1 var book = {
 2 "title": "Professional JavaScript",
 3 "authors": [
 4 "Nicholas C. Zakas"
 5 ],
 6 edition: 3,
 7 year: 2011
 8 };
 9 var jsonText = JSON.stringify(book, function(key, value){
10 switch(key){
11 case "authors":
12 return value.join(",")
13 case "year":
14 return 5000;
15 case "edition":
16 return undefined;
17 default:
18 return value;
19 }
20 });

 

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

 1 //每个级别缩进 4 个空格
 2 var book = {
 3 "title": "Professional JavaScript",
 4 "authors": [
 5 "Nicholas C. Zakas"
 6 ],
 7 edition: 3,
 8 year: 2011
 9 };
10 var jsonText = JSON.stringify(book, null, 4);

保存在 jsonText 中的字符串如下所示:

1 {
2 "title": "Professional JavaScript",
3 "authors": [
4 "Nicholas C. Zakas"
5 ],
6 "edition": 3,
7 "year": 2011
8 }//
9 传入有效的控制缩进的参数值,结果字符串就会包含换行符。(只缩进而不换行意义不大。)最大缩进空格数为 10,所有大于 10 的值都会自动转换为 10。

 

toJSON()方法:

自定义序列化的需求。

 

假设把一个对象传入 JSON.stringify(),序列化该对象的顺序如下:

  • 如果存在 toJSON()方法而且能通过它取得有效的值,则调用该方法。否则,返回对象本身。
  • 如果提供了第二个参数,应用这个函数过滤器。传入函数过滤器的值是第(1)步返回的值。
  • 对第(2)步返回的每个值进行相应的序列化。
  • 如果提供了第三个参数,执行相应的格式化。

 

解析:

 

将 JSON 字符串直接传递给 JSON.parse()就可以得到相应的 JavaScript 值。例如,使用下列代码就可以创建与 book 类似的对象: var bookCopy = JSON.parse(jsonText); 

JSON.parse()方法也可以接收另一个参数,该参数是一个函数,接收两个参数,一个键和一个值,而且都需要返回一个值。

 

转载于:https://www.cnblogs.com/yangxiaoguai132/p/5190478.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jboss-5.1.0_JBoss AS 7.1.0.Final“ Thunder”发布-Java EE 6 Full Profile认证!

jboss-5.1.0在JBoss AS7上进行了大约一年的开发后,我们现已发布7.1.0.Final“ Thunder” ! 可从此处的通常位置下载该文件。 对于JBoss AS7团队来说,这是一个非常大的成就,我们为此版本感到非常自豪。 这个版本包含了7.1.0.CR1b的…

java编程一般类抽象类的定义,Java编程基础抽象类

本文主要是讲述Java编程基础-抽象类,更多Java技术知识,请登陆疯狂软件教育官网。  抽象类:  抽象:不具体,看不明白关键字abstract  抽象类的特点:  1.抽象方法只能定义在抽象类中,抽象类…

蓝牙手柄按键码

/*------------------------------------------------------------------------------ ZetaGC串口码与键码对应关系: 上 0x60 -> 0x26 \ 下 0x30 -> 0x28 | 此4键只能相邻按键组合按下 左 0x20 -> 0x25 | 右 …

【APICloud系列|39】实现人脸识别,人脸登录,人脸信息获取

场景:大部分的APP的注册、登录模式都是采用手机号和密码进行登录或者注册,当然这种模式并没有任何不妥,只是不能快速的实登录或者注册,减少手误或者慢的问题。 资源:现在我们可以通过人脸识别进行登录和注册,比如使用一登SDK集成,或者Facecore SDK集成,前后者都需要编程…

将PostgreSQL PL / Java安装为PostgreSQL扩展

在2011年,我在PostgreSQL PL / Java上写了一系列文章。 基本信息仍然可靠,但是现在有了一种从源代码安装PL / Java的简便方法。 这也消除了依赖第三方来创建软件包的需要。 这些注释将非常简短,因为我认为我的读者已经对git和maven熟悉了。 …

linux下php可以实现哪些功能,基于Linux的远程管理系统的设计与实现(PHP)

基于Linux的远程管理系统的设计与实现(PHP)来源:2BYSJ.cn 资料编号:2SJ260700 资料等级:★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5%A3%BA2SJ260700以下是资料介绍,如需要完整的请充值下载. 本资料已审核过,确保内容和网页里介绍一致. 密 惠1.无需…

MySQL 5.6 my.cnf 参数说明(转)

1 # 以下选项会被MySQL客户端应用读取。2 # 注意只有MySQL附带的客户端应用程序保证可以读取这段内容。3 # 如果你想你自己的MySQL应用程序获取这些值。4 # 需要在MySQL客户端库初始化的时候指定这些选项。5 6 #7 [client]8 #password [your_password]9 port MYSQL_TCP_PORT…

java dto entity,entity与DTO完全一致时

完全一致指的是entity与DTO之间参数名、参数类型、参数个数全部相同的情况entity代码package com.hxd.simple.domain.entity;import java.io.Serializable;import java.time.LocalDateTime;/*** author hxd*/public class User implements Serializable {/*** 用户id*/private …

【APICloud系列|41】融云单聊及消息的处理的对接与实现

包含了单聊及消息的处理。主要分三个页面处理完成,入口首页(index)、消息列表页(message)、会话页面(chat) index.html var rong;apiready=function(){rong = api.require(rongCloud2);//判断用户登录成功后执行方法rongCloud();}function rongCloud(){//初始化init();/…

SQL2000中@@ERROR的使用提醒

SQL SERVER 2000中不支持TRY, CATCH语法&#xff0c;所以对于异常的捕捉处理只可以根据ERROR来判断&#xff1b; 经常的用法是在执行语句后直接判断ERROR <> 0 看是不是执行成功。 然而日前因为存储过程的多并发调用&#xff0c;对一个表插入数据&#xff0c;产生主键冲突…

tostring 16进制_ToString:身份哈希码的十六进制表示形式

tostring 16进制我以前在方便的Apache Commons ToStringBuilder上写过博客&#xff0c;最近有人问我&#xff0c;在生成的String输出中出现的看似神秘的文本是什么构成的。 询问该问题的同事正确地推测出他正在查看的是哈希码&#xff0c;但与他的实例的哈希码不匹配。 我解释说…

uctools.php,discuz 论坛UCenter无法登录,闪退的终极8种解决办法

最近论坛的UCenter无法登录&#xff0c;闪退的解决办法(密码是正确的)在Discuz官方论坛寻找了无数的解决方法&#xff0c;总结有以下几种&#xff1a;1. 直接在Uc_server修改创始人密码改UC创始人密码。修改UC配置文件 /uc_server/data/config.inc.php对应两行换掉define(UC_FO…

前端工程师应该掌握哪些技能才方便找工作?

作为前端工程师,必须掌握到一定的技能才方便找工作,找高薪工作,你需要掌握这些技能。 高清思维导图下载:https://download.csdn.net/download/weixin_41937552/14752706 目录 HTML5+CSS3 移动Web网页开发

dictionary 用linQ排序

Dictionary<string, int> letterWordTotalNum wordsMrg.GetAllLetterTotalNum();var dicSort from d in letterWordTotalNum orderby d.Key select d;foreach (string key in dicSort.Keys){s Response.Write(dicSort[key] "<br />");}按key进行升…

延迟分析中的案例研究:锁定与同步

特别是在这篇文章中&#xff0c;我们将讨论&#xff1a; java.concurrent.Lock创建的垃圾 比较锁与同步 如何以编程方式测量延迟 争用对锁和同步的影响 协调遗漏对延迟测试的影响 回到我最喜欢的主题之一&#xff0c;垃圾创建/分配。 有关此主题的更多详细信息&#xff0…

思维脑图——数据分析实战(最新版)

导读:数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。 在统计学领域,将数据分析划分为描述性统计分析、探索性数据分析以及验证性数据分析,探索性数据分析侧重于在数据之中发现新的特征,而验证…

java servlet jsp javabean关系图,一个关于javaBean+servlet+jsp的MVC架构有关问题

当前位置:我的异常网 Java Web开发 一个关于javaBeanservletjsp的MVC架构有关问题一个关于javaBeanservletjsp的MVC架构有关问题www.myexceptions.net 网友分享于&#xff1a;2013-01-14 浏览&#xff1a;13次一个关于javaBeanservletjsp的MVC架构问题//jsp的代码&#xff1…

并发

http://ifeve.com/volatile/转载于:https://www.cnblogs.com/lemon-now/p/5200645.html

java实现一个旅游网站

导读:采用JSP和Java语言以及html脚本语言,同时采用B/S模式,进行各个界面和每个功能的设计与实现,后台管理与设计选用了SQL Server 2005数据库,前台设计与后台管理相结合,共同完成各功能模块的功能。 目录 基本功能 项目结构 项目截图

【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

来源&#xff1a;http://blog.csdn.net/zhaokaiqiang1992 更多&#xff1a;Android AutoLayout全新的适配方式&#xff0c; 堪称适配终结者 Android的屏幕适配一直以来都在折磨着我们这些开发者&#xff0c;本篇文章以Google的官方文档为基础&#xff0c;全面而深入的讲解了And…