热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaScript系列[05]javaScript和JSON

本文输出和JSON有关的以下内容
❐ JSON和Javascript
❐ JSON的语法介绍
❐ JSON的数据类型
❐ JSON和XMLHTTPRequest
❐ JSON的序列化和反序列化处理

1.1 JSON和Javascript

JSON是一种数据交换格式。

JSON的全称是Javascript Object Notation,翻译为Javascript对象表示法。JSON的这个全称,无疑让很多人既兴奋又困惑,兴奋的人直接认为这就是Javascript中的对象,困惑的人觉察出JSON数据和Javascript对象好像有些不一样。接下来我们先谈一谈JSON数据和Javascript的关系。

诚然,从JSON的全称可以看出JSON和Javascript语言必定有种某种神秘关联,至少能够确定的是JSON的命名确实来源于Javascript这门语言。

JSON基于Javascript对象字面量,但JSON本身是一种数据交换格式,因此它是独立于语言的。JSON全称为Javascript对象表示法,在理解的时候可以认为JSON ==> Javascript && 对象 && 表示法

Javascript我们知道是一门动态脚本语言,那么对象表示法是什么?

对象是面向对象编程语言中一种常见的数据类型,表示键值对的集合,那么表示法是什么?

表示法:是指一个可以表示诸如数字或单词等数据的字符系统。

JSON起源于Javascript(灵感来源于Javascript的对象语法),但真正重要的是具体的表示法本身。JSON不仅独立于语言,而且使用了一种在许多编程语言中能够找到共同元素的表达方式。基于这种简洁的表达方式,JSON迅速成为一种流行的数据交换格式。目前,客户端和服务器端在进行数据通信的时候,常见的数据格式就是JSON和XML。

1.2 JSON的语法介绍

1.2.1 JSON的语法

JSON因为基于Javascript的字面量,所以我们先来看下Javascript字面量的样子,下面给出简单的代码示例,描述了一个书对象。

1 var book = {
2 name:"声名狼藉者的生活",
3 price:42.00,
4 author:"福柯",
5 press:"北京大学出版社",
6 read:function () {
7 console.log("我的书名为:声名狼藉者的的生活,作者为福柯....");
8 }
9 };

顺便贴出一个简短的JSON数据

{
"name":"声名狼藉者的生活",
"price":42.00,
"author":"福柯",
"press":"北京大学出版社",
"content":["a","b","c",123]
}

我们可以对比下上面的Javascript对象和JSON数据,会发现它们的结构和语法形式很像,都是键值对的集合,接下来我们做更详细的说明。JSON数据在表达上和对象保持一致,但因为数据交换格式的核心是数据,所以JSON并不会保存函数等信息。JSON数据所基于的Javascript对象字面量单纯指对象字面量以及其属性的语法表示。

JSON的主要语法特点

① 以键值对的方式来保存数据
② 标准的JSON数据的key必须要使用双引号包裹
③ { } 用于表示和存放对象,[ ] 用于表示和存放数组数据

JSON数据的读取,在读取JSON的时候

{ 表示开始读取对象,} 表示对象读取结束
[ 表示开始读取数组,] 表示数组读取结束
:用于分隔键值对中的key和value
, 用于分隔对象中的多个键值对或者是数组中的多个元素
Javascript对象字面量中的key可以使用单引号,可以使用双引号,可以不必加上引号包裹,但是在JSON中,所有的key必须要加上双引号。

1.2.2 JSON的验证和格式化工具

下面列出一些能够对JSON数据进行校验和格式化的在线地址
https://jsonlint.com/
http://tool.oschina.net/codeformat/json
https://jsonformatter.curiousconcept.com/

1.2.3 JSON文件和MIME类型

在开发中我们经常需要处理大量的JSON数据,JSON这种数据交换格式可以作为独立的文件存在于文件系统中,文件扩展名为 .json

JSON的MIME类型是application/json, 详细信息请参考IANA官网维护的所有媒体类型列表。

1.3 JSON的数据类型

JSON中(作为value值)的数据类型包括对象、字符串、数字、布尔值、null和数组六种

① 字符串
JSON中的字符串可以由任何的Unicode字符构成,字符串的两边必须被双引号包裹。需要注意的是:虽然在Javascript语言中字符串可以使用单引号来包裹,但是在JSON中的字符串必须使用双引号包裹。

如果字符串中存在以下特殊字符,那么需要在它们的前面加上一个反斜线(\)来进行转义。

- " 双引号
- \ 反斜线
- \/ 正斜线
- \b 退格符
- \f 换页符
- \t 制表符
- \n 换行符
- \r 回车符
- \u 后面跟16进制字符

 

② 数字
JSON中的数字可以是整数、小数、负数或者是指数。

③ 布尔类型
JSON数据仅仅支持小写形式的布尔类型值:true 和 false。

④ null类型
JSON中没有undefined这种数据类型,它使用null表示空,并且必须小写。
在Javascript语言中,var obj = null 表示把obj这个对象清空,它和undefined不太一样,null表示什么都没有,undefined表示未定义。

⑤ 对象类型
对象类型是使用逗号分隔的键值对的集合,使用大括号({})裹。

⑥ 数组类型
数组类型是元素的集合,每个元素都可以是字符串、数字、布尔值、对象或者数组中的任何一种。元素与元素之间使用逗号隔开,所有的元素被方括号([])包裹,建议数组中所有的元素都应该是相同数据类型的。

1.4 JSON和XMLHTTPRequest

在前端开发中有一种发送网络请求的技术Ajax,它可以实现异步处理网络通信而不刷新页面。

Ajax的全称为Asynchronous Javascript and XML,即异步的Javascript和XML。我们知道JSON的定位是轻量级的数据交互格式,客户端在和服务器端进行网络通信的时候,服务器端返回给我们的数据大多数是JSON或者是XML。也就是说JSON数据在Ajax网络通信中可能扮演重要的角色,那什么Ajax不叫异步的JSON而叫做异步的XML呢? 答案是:因为刚提出这种网络请求技术的时候,XML相比JSON更流行。

在Ajax网络请求中用到的核心对象XMLHTTPRequest也是如此,其实这个对象命名中包含XML也仅仅是因为对于当时而言,XML是网络请求中最常用的数据交换格式。如果放在今天,那么它们的名字应该叫做AjaJ(Asynchronous Javascript and JSON)和JSONHTTPRequest更合适一些。

1.5 Javascript中JSON数据的序列化和反序列化处理

在网络请求中,如果服务器返回给我们的数据是JSON数据,那么为了方便对数据的操作,通常我们在网络请求成功拿到JSON数据之后会先对JSON数据进行反序列化操作。
在前端开发中,早期的JSON解析基本上由eval函数来完成,ECMAScript5对解析JSON的行为进行了规范,定义了全局对象JSON。目前IE8+、FireFox 3.5+、Opera 10.5、Safari 4+和Chrome等浏览器均支持原生的JSON全局对象。

JSON数据的处理主要涉及到两方面:序列化处理和反序列化处理

1.5.1 使用eavl函数来处理JSON数据

eavl函数说明

Javascript语言中eavl函数可以把字符串转换为js的代码并且马上执行,使用情况和Function构造函数用法类型。

eval("var a = 123;");
console.log(a + 1); //输出结果为124

因为从某种程度上来讲,json其实是Javascript语言的严格子集,所以我们可以直接通过eval函数来对json数据进行解析。需要注意的是,使用eavl函数来对json数据结构求值存在风险,因为可能会执行一些恶意代码。 

eavl函数解析JSON

服务器返回给前端的json数据可能是{...}形式的,也可能是[...]形式的,分别对应js中的对象和数组。如果是{...}形式的,那么在解析的时候,如果直接以eval(json)的方式处理会报错,因为js中不允许直接写{name:”zs”}类似的语句。遇到这种结构的json数据,通常我们有两种方式进行处理:① 包装成表达式 ② 赋值给变量。

 1  
 2 //001 [...] 格式的json数据
 3 var arrJson= '[{"name":"zs","age":18},{"name":"lisi","age":28}]';
 4 var jsOnArr= eval(arrJson);
 5  
 6 //002 {...} 格式的json数据
 7 var objJson = `{"name":"wendingding","age":18,"contentAbout":["Javascript","CSS","HTML"],"car":{"number":"粤A6666","color":"red"}}`;
 8  
 9 //eval(json); 错误的演示:报错
10 //处理方式(1):以拼接的方式赋值给变量
11 eval("var jsonObj1 = " + objJson);
12 //处理方式(2):包装成表达式
13 var jsonObj2 = eval("(" + objJson +")");
14  
15 //打印转换后得到的数组|对象
16 console.log(jsonArr);
17 console.log(jsonObj1);
18 console.log(jsonObj2);

Javascript系列 [05]-Javascript和JSON

1.5.2 使用JSON全局对象来处理JSON数据

JSON全局对象拥有两个方法:stringify()和parse(),其中parse方法用于把json数据反序列化为原生的js,stringify方法用于把js对象序列化为json字符串。

parse方法的使用
语法:JSON.parse(jsonString,[fn])

参数说明

第一个参数:jsonString为要解析的json字符串
第二个参数:fn是一个可选参数,该参数为函数类型,接收两个参数,分别是每个键值对的key和value。

 1  
 2 //json字符串
 3 var objJson = `{"name":"wendingding","age":18,"contentAbout":["Javascript","CSS","HTML"],"car":{"number":"粤A6666","color":"red"}}`;
 4  
 5 //把json字符串转换为js数组
 6 var arrJson= '[{"name":"zs","age":18},{"name":"lisi","age":28}]';
 7  
 8 //把json字符串转换为js对象
 9 var jsOnObj= JSON.parse(objJson);
10 var jsOnArr= JSON.parse(arrJson);
11 console.log(jsonObj);
12 console.log(jsonArr);
13  
14 //演示parse方法中函数参数的使用
15 function fn(key, value) {
16 if (key === "name") {
17 return value + "++" //在原有value值的基础上拼接++字符串
18 } else if (key === "age") {
19 return undefined //如果返回undefined,则表示删除对应的键值对
20 } else {
21 return value //正常返回对应的value值
22 }
23 }
24 console.log(JSON.parse(objJson, fn));

Javascript系列 [05]-Javascript和JSON

 

stringify方法使用说明

语法:JSON.stringify(Obj,[fn|arr],[space])

参数说明

第一个参数:Obj为要进行序列化操作的Javascript对象
第二个参数:过滤器,可以是函数或者是一个数组
第三个参数:是否在生成的json字符串中保留缩进,用于控制缩进的字符

 1 //js中的普通对象
 2 var obj = {
 3 name:"zs",
 4 age:18,
 5 friends:["小霸王","花仙子","奥特曼"],
 6 other:undefined,
 7 showName:function () {
 8 console.log(this.name);
 9 }
10  
11 };
12  
13 //把js中的对象转换为json字符串
14 //注意:
15 //001 如果键值对中存在value值为undefined的数据,那么会被跳过
16 //002 对象中的方法以及该对象的原型成员数据在进行转换的时候,会被有意忽略
17 console.log(JSON.stringify(obj));
18  
19 //控制缩进,该参数的值可以是数字也可以是字符串,自动换行
20 //001 如果是字符串那么会把对应的字符拼接在键值对前面,超过10个字符的省略
21 //002 如果是数字那么会设置对应的缩进,最多为10,超过则默认为10
22 console.log(JSON.stringify(obj, null, 4));
23 console.log(JSON.stringify(obj, null, "@@"));
24  
25 //过滤器(数组):表示只处理key为name和age这两个键值对
26 console.log(JSON.stringify(obj, ["name","age"]));
27  
28 //过滤器(函数):
29 function fn(key,value) {
30 if (key === "age")
31 {
32 return value + 20;
33 }else if (key === "name")
34 {
35 return undefined; //过滤掉key为name这个键值对
36 }else
37 {
38 return value;
39 }
40 }
41 console.log(JSON.stringify(obj,fn));

Javascript系列 [05]-Javascript和JSON

 

JSON数据总结

❐ JSON全称是Javascript Object Notation基于Javascript,是Javascript的子集。
❐ JSON虽然是Javascript的子集,但并不从属于Javascript,它独立于语言。
❐ JSON是用来表示和传输数据的格式,比XML更轻量级,现已成为web数据交换的事实标准。
❐ JSON的优势在于其可以方便的把JSON字符串数据转换为对应的对象,比XML更方便且数据更小。
❐ JSON语法可以表示:字符串、数值、布尔值、null、对象和数组6种类型的值,不支持undefined。
❐ JSON中的”键”区别于Javascript,必须要加上双引号。
❐ JSON解析可以使用传统的eval函数,或ECMAScript5推出的全局对象来处理。

参考资料

JSON官网:http://json.org/
JSON***:https://en.wikipedia.org/wiki/JSON
JSON作者简介:https://en.wikipedia.org/wiki/Douglas_Crockford
JSON必知必会:https://book.douban.com/subject/26789960/
Javascript高级程序设计:https://book.douban.com/subject/10546125/︎

  • Posted by 博客园·文顶顶 ~ 文顶顶的个人博客_花田半亩
  • 联系作者 简书·文顶顶 新浪微博·Coder_文顶顶
  • 原创文章,版权声明:***转载-非商用-非衍生-保持署名 | 

推荐阅读
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
author-avatar
辛勤的核桃4dr_797
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有