JSON教程(非常详细)

    "start": "node ./bin/www"
},
"dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.16.0",
    "http-errors": "~1.6.2",
    "jade": "~1.11.0",
    "morgan": "~1.9.0"
}

}


提示:虽然 JSON 可以用来定义配置文件,但由于 JSON 中不能添加注释,使得配置文件的可读性较差。


### 总结


JSON 是一种轻量级的数据交换格式,它是基于 JavaScript 的一个子集,采用完全独立于编程语言的格式来表示数据,可以跨语言、跨平台使用。简洁清晰的层次结构使得 JSON 逐渐替代了 XML,成为了最理想的数据交换格式,广泛应用于 Web 开发领域。


## JSON语法规则


JSON 的语法与 JavaScript 中的对象很像,在 JSON 中主要使用以下两种方式来表示数据:


* Object(对象):键/值对(名称/值)的集合,使用花括号`{ }`定义。在每个键/值对中,以键开头,后跟一个冒号`:`,最后是值。多个键/值对之间使用逗号`,`分隔,例如`{"name":"C语言中文网","url":"http://c.biancheng.net"}`;
* Array(数组):值的有序集合,使用方括号`[ ]`定义,数组中每个值之间使用逗号`,`进行分隔。


下面展示了一个简单的 JSON 数据:



{
“Name”:“C语言中文网”,
“Url”:“http://c.biancheng.net/”,
“Tutorial”:“JSON”,
“Article”:[
“JSON 是什么?”,
“JSONP 是什么?”,
“JSON 语法规则”
]
}


注意:所有 JSON 数据需要包裹在一个花括号中,类似于 JavaScript 中的对象。


### JSON 中的键


JSON 数据是以键/值对(名称/值)的形式书写的,键表示数据的名称,需要以字符串的形式定义(在双引号中定义),后面紧跟一个冒号,最后是值,如下例所示:


“name”:“C语言中文网”


类似于 JavaScript 对象中的:


name:“C语言中文网”


### JSON 中的值


JSON 中的值可以是以下数据类型:


* 数字(整数或浮点数);
* 字符串(需要在双引号中定义);
* 布尔值(true 或 false);
* 数组(在方括号中定义);
* 对象(在花括号中定义);
* null(空)。


另外,在 JSON 中,不同的键/值对之间需要使用逗号进行分隔,如下例所示:



{
“number”:123,
“float”:3.14,
“string”:“C语言中文网”,
“bool”:true,
“array”:[
“employees”,
{“name”:“peter”, “age”: 18},
{“name”:“Anna”, “age”: 16}
],
“object”:{
“name”:“C语言中文网”,
“url”:“http://c.biancheng.net/”
}
}


在使用 JSON 时,有以下几点需要注意:


* JSON 是一段包裹在花括号中的数据,数据由若干键/值对组成;
* 键和值之间使用冒号分隔;
* 不同的键/值对之间使用逗号分隔;
* 键需要以字符串的形式定义(即使用双引号包裹,注意:不能使用单引号);
* 值可以是数字、字符串、布尔值、数组、对象、null;
* 键必须是唯一的,不能重复,否则后定义的键/值对会覆盖前面定义的键/值对;
* JSON 中不可以使用八进制或十六进制表示数字。


### JSON 与 JavaScript 对象的区别


粗略的看起来,您可能觉得 JSON 就是一个 JavaScript 的对象,但其实不是这样的,JSON 与 JavaScript 对象之间还是有区别的。


首先,JSON 是一种数据交换格式,可以跨语言、跨平台使用,它只是与 JavaScript 有些渊源,并不是 JavaScript 的一部分。


就语法而言,JSON 与 JavaScript 最主要的区别就是,JSON 中每个键都必须是一个字符串,而 JavaScript 对象则没有这个限制,如下所示:



// JavaScript 中的对象
{
foo: “bar”
}

// JSON
{
“foo”: “bar”
}


另外,在 JavaScript 对象中,您既可以使用双引号也可以使用单引号,但在 JSON 中只能使用双引号。还有就是 JSON 中没有日期类型,也不能定义注释,所以您只能通过日期的字符串(例如:1970-01-01)或者时间戳(例如:1632366361)来表示日期。


## JSON数据类型


JSON 是 Web 开发中使用最广泛的数据交换格式,它独立于编程语言,能够被大多数编程语言使用。本节我们来详细介绍一下 JSON 中支持的数据类型。


JSON 中支持的数据类型可以分为简单数据类型和复杂数据类型两种,其中简单数据类型包括:string(字符串)、number(数字)、boolean(布尔值)和 null(空);复杂数据类型包括:Array(数组)和 Object(对象)。


### 1、字符串


JSON 中的字符串需要使用双引号定义(注意:不能使用单引号),字符串中可以包含零个或多个 Unicode 字符。另外,JSON 的字符串中也可以包含一些转义字符,例如:


* `\\`反斜线本身;
* `\/`正斜线;
* `\"`双引号
* `\b`退格;
* `\f`换页;
* `\n`换行;
* `\r`回车;
* `\t`水平制表符;
* `\u`四位的十六进制数字。


示例代码如下:



{
“name”:“C语言中文网”,
“url”:“http://c.biancheng.net/”,
“title”:“JSON 数据类型”
}


### 2、数字


JSON 中不区分整型和浮点型,只支持使用 IEEE-754 双精度浮点格式来定义数字。此外,JSON 中不能使用八进制和十六进制表示数字,但可以使用 e 或 E 来表示 10 的指数。


IEEE-754 表示二进制浮点数算术标准,是 20 世纪 80 年代以来使用最广泛的浮点数运算标准。


示例代码如下:



{
“number_1” : 210,
“number_2” : -210,
“number_3” : 21.05,
“number_4” : 1.0E+2
}


### 3、布尔值


JSON 中的布尔值与 JavaScript、PHP、Java 等编程语言中相似,有两个值,分别为 true(真)和 false(假),如下例所示:



{
“message” : true,
“pay_succeed” : false
}


### 4、空


null(空)是 JSON 中的一个特殊值,表示没有任何值,当 JSON 中的某些键没有具体值时,就可以将其设置为 null,如下例所示:



{
“id” : 1,
“visibility” : true,
“popularity” : null
}


### 5、对象


JSON 中,对象由花括号`{ }`以及其中的若干键/值对组成,一个对象中可以包含零个或多个键/值对,每个键/值对之间需要使用逗号`,`分隔,如下例所示:



{
“author”: {
“name”: “C语言中文网”,
“url”: “http://c.biancheng.net/”
}
}


### 6、数组


JSON 中,数组由方括号`[ ]`和其中的若干值组成,值可以是 JSON 中支持的任意类型,每个值之间使用逗号`,`进行分隔,如下例所示:



{
“course” : [
“JSON 教程”,
“JavaScript 教程”,
“HTML 教程”,
{
“website” : “C语言中文网”,
“url” : “http://c.biancheng.net”
},
[
3.14,
true
],
null
]
}


## JSON对象(object)


在 JSON 中,对象是一个无序的、键/值对的集合,一个对象以左花括号`{`开始,以右花括号`}`结束,左右花括号之间为对象中的若干键/值对。键/值对中,键必须是字符串类型(即使用双引号将键包裹起来),而值可以是 JSON 中的任意类型,键和值之间需要使用冒号`:`分隔开,不同的键/值对之间需要使用逗号`,`分隔开。关于 JSON 中支持的数据类型,您可以查阅《[JSON数据类型]( )》一节。


下面来看一个 JSON 对象的例子:



{
“website”: {
“name” : “C语言中文网”,
“url” : “http://c.biancheng.net/”
}
}


通过上面的示例可以看出,整个 JSON 就是一个对象类型,在这个对象中包含一个名为“website”的键,与键所对应的值同样也是一个对象,对象中包含“name”、“url”等键,以及与键所对应的值。


在 JSON 中使用对象类型时,有以下几点需要注意:


* 对象必须包裹在花括号`{ }`中;
* 对象中的内容需要以键/值对的形式编写;
* 键必须是字符串类型,即使用双引号`" "`将键包裹起来;
* 值可以是任意 JSON 中支持的数据类型(例如字符串、数字、对象、数组、布尔值、null 等);
* 键和值之间使用冒号进行分隔;
* 不同键/值对之间使用逗号进行分隔;
* 对象中的最后一个键/值对末尾不需要添加逗号。


另外,JSON 对象中可以嵌套其它的任意类型,例如对象、数组等,如下例所示:



// 键/值对中,键必须使用双引号定义,值若是字符串类型也必须使用双引号定义
{
“name”: “C语言中文网”,
“age”: 18,
“url”: “http://c.biancheng.net/”,
“course”: {
“title”: “JSON教程”,
“list”: [
“JSON是什么?”,
“JSON语法规则”,
“JSON数据类型” // 这个地方不能添加逗号,因为它是数组中最后一个值
] // 这个地方也不能添加逗号,因为它是对象中最后一个键/值对
} // 这个地方也不可以有逗号,因为它也是对象的最后一个键/值对
}


提示:上面示例中,注释不是 JSON 的一部分,因为 JSON 中不支持定义注释。使用上述 JSON 数据之前,需要先将注释内容删除。


## JSON数组(array)


数组是值的有序集合,JSON 中的数组与 JavaScript 中的数组相似,同样需要使用方括号`[ ]`定义,方括号中为数组中的若干值,值可以是 JSON 中支持的任意类型(例如字符串、数字、布尔值、对象、数组等),每个值之间使用逗号`,`分隔开,具体语法格式如下:


[value\_1, value\_2, value\_3, …, value\_N]


下面来看一个 JSON 数组的示例:



{
“array”:[
{
“name”:“C语言中文网”,
“url”:“http://c.biancheng.net/”,
“course”:“JSON教程”
},
[
“JSON是什么?”,
“JSON语法规则”,
“JSON数据类型”
],
“JSON”,
18,
true
]
}


通过上面的示例可以看出,JSON 中数组与对象不同,对象是由若干键/值对组成,而数组则是由若干值构成的。数组中的值可以是 JSON 中的任意类型,在上面的示例中就分别使用了对象、数组、字符串、数字、布尔值等类型。


在 JSON 中使用数组时,有以下几点需要注意:


* 数组必须使用方括号`[ ]`定义;
* 数组的内容由若干值组成;
* 每个值之间需要使用逗号`,`进行分隔;
* 最后一个值末尾不需要添加逗号;
* 数组中的值可以是 JSON 中的任何类型,例如字符串、数字、对象、数组、布尔值、null 等。


## JSON注释


JSON 是一种纯粹的数据交换格式,其简单、灵活的特性使得 JSON 适合被用于各种不同的场景,例如在配置文件中、在接口返回的数据中都会用到 JSON 格式。然而 JSON 却有一个非常明显的缺点,那就是 JSON 不能像编程语言那样添加注释,JSON 中的任何内容都会看作数据的一部分。


之所以不允许添加注释,是因为 JSON 主要是用来存储数据的,过多的注释会对数据的可读性造成影响,同时也会造成数据体积变大,进而影响数据传输、解析的速度。


但是,在某些场景中,我们又需要使用注释。例如在 JSON 格式的配置文件中,我们希望以注释的形式对配置信息进行解释说明;在接口返回的 JSON 数据中,我们希望通过注释描述数据的含义等等。那么我们要怎么在 JSON 数据中添加注释呢?下面就来介绍几种方法。


### 使用特殊的键名


想要在 JSON 中添加注释,我们可以在要添加注释键/值对的前面(或后面)添加一个同名的键,并在键名中添加一个特殊字符加以区分,例如`@`、`#`、`?`、`_`、`/`等,然后在与键对应的值中定义注释的内容。


注意:在键名中添加特殊字符时,应尽量避免`:`、`{`、`}`、`[`、`]`等 JSON 中常用的字符。


下面通过一个简单的示例来演示一下如何通过特殊的键名在 JSON 中添加注释:



{
“@name”: “网站名称”,
“name”: “C语言中文网”,
“_url”: “网址”,
“url”: “http://c.biancheng.net/”,
“course”: “JSON 教程”,
“@charge”: “0=收费; 1=免费”,
“charge”: 1,
“#list”: “教程目录”,
“list”: [
“JSON数据类型”,
“JSON对象”,
“JSON数组”
],
“message”: {
“code”: 0,
“message”: “OK”,
“#data”: {
“#id”: “用户ID”,
“#type”: “0=正常; 1=异常”,
“#name”: “姓名”,
“#createTime”: “创建时间(yyyy-MM-dd)”
},
“data”: {
“id”: “12345”,
“type”: 0,
“name”: “我的名字”,
“createTime”: “2020-05-20”
}
}
}


除了可以在键名中添加特殊字符外,也可以直接以“comment”、“\_comment” 或 “\_\_comment”作为键名来定义注释,如下例所示:



{
“_comment”: “C语言中文网(http://c.biancheng.net/)—— 一个在线学习编程的网站”,
“course”: {
“name”: “JSON 教程”,
“url”: “http://c.biancheng.net/json/index.html”
}
}


### JSON5


JSON5 是由开发人员创建并在 GitHub(https://github.com/json5/json5/tree/4cf57da675f55c619f959132eb58a5683ca4a9c7)上发布的 JSON 的非官方标准,可以将它看作是 JSON 的升级版。JSON5 主要是通过引入部分 ECMAScript5.1 的特性来扩展 JSON 语法,减少 JSON 的某些限制,同时兼容现有的 JSON 格式。


与 JSON 相比,JSON5 做出了如下改变:


* 在对象或数组的末尾(即最后一个键/值对或值),可以添加逗号;
* 字符串可以使用单引号定义;
* 字符串中可以包含转义字符,并且可以跨越多行;
* 可以定义十六进制的数字;
* 数字可以包含前导或后导的小数点;
* 数字前可以添加一个加、减号来表示正负数;
* 可以使用`//`来定义单行注释,使用`/* ... */`来定义多行注释。


如下例所示:



{
// 网站名称
“name”: “C语言中文网”,
// 网址
“url”: “http://c.biancheng.net/”,
“course”: “JSON 教程”,
// 0=收费; 1=免费
“charge”: 1,
// 教程目录
“list”: [
“JSON数据类型”,
“JSON对象”,
“JSON数组”
],
“message”: {
“code”: 0,
“message”: “OK”,
/*
id = 用户ID
type = 0=正常; 1=异常
name = 姓名
createTime = 创建时间(yyyy-MM-dd)
*/
“data”: {
“id”: “12345”,
“type”: 0,
“name”: “我的名字”,
“createTime”: “2020-05-20”
}
}
}


要使用 JSON5 非常简单,如果是在前端中使用,您可以直接引入一个 js 文件,如下例所示:


上面引入的 js 文件会创建一个全局的 JSON5 对象,示例代码如下:



JavaScript

运行结果如下图所示:


![在网页中引用 JSON5](https://img-blog.csdnimg.cn/img_convert/56838d59c03cb41fec2287b9abfe478f.gif)  
 图:在网页中引用 JSON5


此外,您也可以通过 Node.js 来安装 JSON5,安装命令如下:


npm install json5


安装成功后可以通过`const JSON5 = require('json5')`来创建全局的 JSON5 对象,如下例所示:


C:\Users\79330>npm install json5  
 npm WARN saveError ENOENT: no such file or directory, open ‘C:\Users\79330\package.json’  
 npm notice created a lockfile as package-lock.json. You should commit this file.  
 npm WARN enoent ENOENT: no such file or directory, open ‘C:\Users\79330\package.json’  
 npm WARN 79330 No description  
 npm WARN 79330 No repository field.  
 npm WARN 79330 No README data  
 npm WARN 79330 No license field.


+ json5@2.2.0  
 added 2 packages from 5 contributors and audited 2 packages in 2.525s  
 found 0 vulnerabilities


C:\Users\79330>node  
 Welcome to Node.js v14.17.6.  
 Type “.help” for more information.  
 > const JSON5 = require(‘json5’)  
 undefined  
 > var arr = {  
 … // 网站名称  
 … “name”: “C语言中文网”,  
 … // 网址  
 … “url”: “http://c.biancheng.net/”,  
 … “course”: “JSON 教程”,  
 … // 0=收费; 1=免费  
 … “charge”: 1,  
 … // 教程目录  
 … “list”: [  
 … “JSON数据类型”,  
 … “JSON对象”,  
 … “JSON数组”  
 … ],  
 … “message”: {  
 … “code”: 0,  
 … “message”: “OK”,  
 … /\*  
 … id = 用户ID  
 … type = 0=正常; 1=异常  
 … name = 姓名  
 … createTime = 创建时间(yyyy-MM-dd)  
 … \*/  
 … “data”: {  
 … “id”: “12345”,  
 … “type”: 0,  
 … “name”: “我的名字”,  
 … “createTime”: “2020-05-20”  
 … }  
 … };  
 undefined  
 > JSON5.stringify(arr)  
 “{name:‘C语言中文网’,url:‘http://c.biancheng.net/’,course:‘JSON 教程’,charge:1,list:[‘JSON数据类型’,‘JSON对象’,‘JSON数组’],message:{code:0,message:‘OK’,data:{id:‘12345’,type:0,name:‘我的名字’,createTime:‘2020-05-20’}}}”


## JSON和XML的区别


JSON 和 XML 都是基于文本的可读格式,独立于编程语言,能够在几乎所有的编程语言中使用。本节我们就来介绍一下 JSON 和 XML 的区别。


在介绍 JSON 和 XML 的区别之前,我们先来分别介绍一下 JSON 和 XML。


### 什么是 XML?


XML 全称“Extensive Markup Language”,译为“可扩展标记语言”,是一种源自 SGML 的、基于文本的数据格式(XML 是 SGML 的一个子集)。


SGML 全称“Standard Generalized Markup language”,译为“标准通用标记语言”,简称“通用标言”,是一种定义电子文档结构和描述其内容的国际标准语言,是 1986 年国际标准化组织出版发布的一个信息管理方面的国际标准。


XML 是一种专门为了存储数据而创建的标记语言,它的编写方式与 HTML 非常相似,能够通过不同的标签来标记不同的内容,下面展示了一个简单 XML 数据:



<?xml version="1.0" encoding="ISO-8859-1"?> JSON教程 C语言中文网 http://c.biancheng.net/
  • JSON是什么?
  • JSONP是什么?
  • JSON语法规则
  • 
    XML 旨在传输或保存数据,而不是显示数据,在 XML 中,没有预定义标签,其中使用的所有标签都是自定义的,而且所有的标签都由两个部分组成,分别是开始标签(例如)和结束标签(例如)。需要注意的是,XML 中的标签是区分大小写的。
    
    
    XML 的主要优点是它可以跨平台、跨语言进行传输。另外,XML 数据可以保存在格式为 .xml 的文本文件中。
    
    
    ### 什么是 JSON?
    
    
    JSON 全称“JavaScript Object Notation”,译为“JavaScript 对象简谱”或“JavaScript 对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。与 XML 相同,JavaScript 同样可以跨平台、跨语言传递数据。
    
    
    JSON 数据的结构类似于一个 JavaScript 对象,如下例所示:
    
    
    
    

    {
    “title”:“JSON教程”,
    “author”:“C语言中文网”,
    “url”:“http://c.biancheng.net/”,
    “catalogue”:[
    “JSON是什么?”,
    “JSONP是什么?”,
    “JSON语法规则”
    ]
    }

    
    JSON 的优点在于其结构灵活,所有的浏览器都支持。而且 JSON 语法简单,大多数编程语言都支持 JSON(有些本身就支持,有些可以通过第三方库得到支持)。另外,JSON 数据可以存储在 .json 格式的文本文件中。
    
    
    有关 JSON 的详细介绍,您可以查阅《[JSON是什么?]( )》一节。
    
    
    ### JSON 与 XML 之间的差异
    
    
    尽管 JSON 和 XML 的功能非常相似,但它们之间还是存在一些差异的,如下表所示:
    
    
    
    
    | JSON | XML |
    | --- | --- |
    | JSON 是一种数据格式 | XML 是一种标记语言 |
    | 与 XML 相比,JSON 数据更容易阅读 | XML 文档相对来说阅读起来比较困难 |
    | JSON 数据可以存储在 .json 格式的文本文件中 | XML 数据可以存储在 .xml 格式的文本文件中 |
    | JSON 中支持字符串、数字、数组、布尔值等类型 | XML 中只有字符串类型 |
    | JSON 没有显示功能 | XML 提供了显示数据的能力,因为它是一种标记语言 |
    | JSON 仅支持 UTF-8 编码 | XML 支持各种编码 |
    | JSON 不支持注释 | XML 支持注释 |
    | JSON 不支持命名空间 | XML 支持命名空间 |
    | JSON 读写速度更快,且更容易解析 | 相对于 JSON,XML 数据结构更加复杂,解析速度相对较慢 |
    | 相对于 XML,JSON 的安全性较低 | 相对于 JSON,XML 的安全性更高 |
    
    
    ### JSON 与 XML 之间的相似之处
    
    
    除了有许多不同的地方外,JSON 与 XML 之间也有许多相似的地方,最主要的就是,它们的用途是相同的,即存储和传输数据。其次,它们都可以存储在文本文件中,程序员无需借助计算机就可以读写它们中的内容。
    
    
    此外,在 HTTP 请求中,JSON 和 XML 都能够作为传输数据的类型,在服务器与客户端之间进行传递。
    
    
    ## JSON对比工具
    
    
    JSON 是 Web 开发领域中最常用的数据传输格式之一,因为 JSON 的可读性较高,对于一些简单的 JSON 数据,我们不需要借助任何工具就可以轻易的读取。但对于复杂的 JSON 数据就需要借助工具才行,本节我们来介绍一些 JSON 对比工具。
    
    
    要对比 JSON 数据,最简单的方法就是借助在线工具,在线工具即不需要安装,也不需要配置环境就可以拿来使用,在网络中可以找到许多优秀的 JSON 在线对比工具,如下所示:
    
    
    * https://jsoncompare.org/
    * https://jsoncompare.com/#!/diff/
    * https://jsondiff.org/
    * http://jsondiff.com/
    * http://www.jsondiff.com/
    * https://extendsclass.com/json-diff.html
    * https://www.textcompare.org/json/
    * https://jsoncompare.org/
    * https://alldiff.in/
    * https://bestjsonformatter.com/json-diff/
    * https://www.jsonformatting.com/json-compare/
    * https://url-decode.com/tool/json-diff/
    * https://www.sojson.com/jsondiff.html
    * https://www.json.cn/
    * http://json365.com/json\_compare
    * https://jsonlint.com/
    
    
    以 https://jsondiff.org/ 为例,要对比两个 JSON 数据,具体操作如下图所示:
    
    
    ![对比两个 JSON 数据](https://img-blog.csdnimg.cn/img_convert/c1e0587018942e945837068306fa9cc5.gif)  
     图:对比两个 JSON 数据
    
    
    对比结果如下图所示:
    
    
    ![JSON 数据对比结果](https://img-blog.csdnimg.cn/img_convert/6d3ca7fd775fa1bb730d6f4409f653cb.gif)  
     图:JSON 数据对比结果
    
    
    除了在线工具外,我们也可以通过代码编辑器来对比 JSON 数据,例如 Visual Studio Code(简称“VS Code”)中就内置了文件对比工具,具体操作如下:
    
    
    首先,选中第一个要对比的文件,点击鼠标右键,在弹出的菜单中选择“选择以进行比较”或“Select for Compare”,如下图所示:
    
    
    ![选择第一个要对比的文件](https://img-blog.csdnimg.cn/img_convert/c2ef22fddb743b1a61fab17d2efe2e80.gif)  
     图:选择第一个要对比的文件
    
    
    然后,选中第二个要对比的文件,点击鼠标右键,在弹出的菜单中选择“与已选项目进行比较”或“Compare with Selected”,如下图所示:
    
    
    ![选择第二个要对比的文件](https://img-blog.csdnimg.cn/img_convert/9fa2db3ccf66786a6d971c86e003bb64.gif)  
     图:选择第二个要对比的文件
    
    
    对比结果如下图所示:
    
    
    ![对比两个 json 文件](https://img-blog.csdnimg.cn/img_convert/4372a1ed6d8311abcf2aa38995648738.gif)  
     图:对比两个 json 文件
    
    
    除了 VS Code 外,使用 Sublime Text 编辑器也可以进行文件对比,但是需要在 Sublime Text 中安装一个名为“Sublimerge”的插件,插件的安装方法大家可以参考 https://www.cnblogs.com/superjishere/p/11624668.html。插件安装完成后就可以进行文件对比了,具体操作如下:
    
    
    首先,在第一个要对比的文件中单击鼠标右键,在弹出的菜单中选择“Sublimerge”→“Compare to View”,如下图所示:
    
    
    ![第一个要对比的文件 ](https://img-blog.csdnimg.cn/img_convert/280a6e2cb51344061840270f74e6c086.gif)  
     图:第一个要对比的文件
    
    
    然后,在弹出的菜单中选择第二个要对比的文件,如下图所示:
    
    
    ![第二个要对比的文件](https://img-blog.csdnimg.cn/img_convert/e6ab4240146e00fc939d444fa4c1f24b.gif)  
     图:第二个要对比的文件
    
    
    对比结果如下图所示:
    
    
    ![对比两个 json 文件](https://img-blog.csdnimg.cn/img_convert/c4e6a67a2e4b5edf711f80f1df11c08a.gif)  
     图:对比两个 json 文件
    
    
    ## PHP JSON的解析和创建
    
    
    JSON(全称“JavaScript Object Notation”)是一种轻量级的数据交换格式,易于读写,广泛应用于 Web 开发领域。本节我们来介绍一下在 PHP 中如何创建和解析 JSON 数据。
    
    
    PHP 中提供了 json\_encode() 和 json\_decode() 两个函数分别创建和解析 JSON 数据,其中:
    
    
    * json\_encode():可以将变量转换为 JSON 格式;
    * json\_decode():可以对 JSON 格式的字符串进行解析。
    
    
    ### json\_encode()
    
    
    json\_encode() 函数能够将一个 PHP 变量转换为 JSON 数据,其语法格式如下:
    
    
    json\_encode(mixed $value, int $options = 0, int $depth = 512): string | false
    
    
    参数说明如下:
    
    
    * $value:要转换的变量,变量可以是任意数据类型;
    * $options:可选参数,默认值为 0,可选值为以下 PHP 常量:JSON\_FORCE\_OBJECT、JSON\_HEX\_QUOT、JSON\_HEX\_TAG、JSON\_HEX\_AMP、JSON\_HEX\_APOS、JSON\_INVALID\_UTF8\_IGNORE、JSON\_INVALID\_UTF8\_SUBSTITUTE、 JSON\_NUMERIC\_CHECK、JSON\_PARTIAL\_OUTPUT\_ON\_ERROR、JSON\_PRESERVE\_ZERO\_FRACTION、JSON\_PRETTY\_PRINT、JSON\_UNESCAPED\_LINE\_TERMINATORS、JSON\_UNESCAPED\_SLASHES、JSON\_UNESCAPED\_UNICODE、JSON\_THROW\_ON\_ERROR。关于这些常量了解即可,一般不怎么使用,它们的具体含义您可以通过 [JSON 常量]( )查阅;
    * $depth:可选参数,用来设置递归的最大深度,它的值必须大于 0,默认值为 512,同 $options 参数一样,该参数同样不怎么使用。
    
    
    若转换成功,json\_encode() 函数会返回字符串类型的转换结果,若转换失败,则返回 false。
    
    
    【示例】使用 json\_encode() 函数将 PHP 变量转换为 JSON 格式:
    
    
    
    
    <?php $arr = [ "title" => "JSON教程", "author" => "C语言中文网", "url" => "http://c.biancheng.net/", "catalogue" => [ "JSON是什么?", "JSONP是什么?", "JSON语法规则" ] ]; echo json\_encode($arr); ?>
    
    运行结果如下:
    
    
    {“title”:“JSON\u6559\u7a0b”,“author”:“C\u8bed\u8a00\u4e2d\u6587\u7f51”,“url”:“http://c.biancheng.net/”,“catalogue”:[“JSON\u662f\u4ec0\u4e48\uff1f”,“JSONP\u662f\u4ec0\u4e48\uff1f”,“JSON\u8bed\u6cd5\u89c4\u5219”]}
    
    
    通过运行结果可以看出,在使用 json\_encode() 函数将变量转换为 JSON 数据时,会将变量中的中文字符编码为 Unicode 字符(\uXXXX 格式的字符),如果不需要这样的转换,将 json\_encode() 函数的第二个参数设置为 JSON\_UNESCAPED\_UNICODE 即可,如下例所示:
    
    
    
    
    <?php $arr = [ "title" => "JSON教程", "author" => "C语言中文网", "url" => "http://c.biancheng.net/", "catalogue" => [ "JSON是什么?", "JSONP是什么?", "JSON语法规则" ] ]; echo json\_encode($arr,JSON\_UNESCAPED\_UNICODE ); ?>
    
    运行结果如下:
    
    
    {“title”:“JSON教程”,“author”:“C语言中文网”,“url”:“http://c.biancheng.net/”,“catalogue”:[“JSON是什么?”,“JSONP是什么?”,“JSON语法规则”]}
    
    
    ### json\_decode()
    
    
    json\_decode() 函数能够解析 JSON 格式的字符串,并将解析后的结果保存到一个变量中,其语法格式如下:
    
    
    json\_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0): mixed
    
    
    参数说明如下:
    
    
    * $json:必填参数,要解析的 JSON 字符串;
    * $assoc:可选参数,默认值为 false,若将值设置为 true,那么 json\_decode() 函数将返回一个数组;
    * $depth:可选参数,用来设置递归的最大深度,默认值为 512,也可以设置为其它大于 0 的值;
    * $options:可选参数,默认值为 0,可选值为 JSON\_BIGINT\_AS\_STRING、JSON\_INVALID\_UTF8\_IGNORE、JSON\_INVALID\_UTF8\_SUBSTITUTE、JSON\_OBJECT\_AS\_ARRAY、JSON\_THROW\_ON\_ERROR 等常量,可以同时设置多个常量,常量之间使用竖线`|`进行分隔。有关上述常量的含义,您可以通过 [PHP 预定义常量]( )查阅。
    
    
    若解析成功,json\_decode() 函数会返回 JSON 中的数据,若解析失败,或者 JSON 的数据深度超过了递归的限制,则返回 null。
    
    
    【示例】使用 json\_decode() 函数解析 JSON 数据:
    
    
    
    
    <?php $str = '{"title":"JSON教程","author":"C语言中文网","url":"http:\/\/c.biancheng.net\/","catalogue":["JSON是什么?","JSONP是什么?","JSON语法规则"]}'; echo "
    ";
        var\_dump(json\_decode($str, true));
    ?>
    
    
    运行结果如下:
    
    
    array(4) {  
     [“title”]=>  
     string(10) “JSON教程”  
     [“author”]=>  
     string(16) “C语言中文网”  
     [“url”]=>  
     string(23) “http://c.biancheng.net/”  
     [“catalogue”]=>  
     array(3) {  
     [0]=>  
     string(16) “JSON是什么?”  
     [1]=>  
     string(17) “JSONP是什么?”  
     [2]=>  
     string(16) “JSON语法规则”  
     }  
     }
    
    
    ## Python JSON的解析和创建
    
    
    本节我们来介绍一下如何使用 Python 来创建和解析 JSON 数据。
    
    
    与 PHP 类似,Python 中同样提供了两个函数来分别创建和解析 JSON 数据,注意:本节是基于 Python3 进行介绍的:
    
    
    * json.dumps():将 Python 对象转换为 JSON 数据;
    * json.loads():将 JSON 数据解析为 Python 对象。
    
    
    ### json.dumps()
    
    
    在 Python 中,您可以使用 json.dumps() 函数将 Python 对象转换为 JSON 数据,语法格式如下:
    
    
    json.dumps(obj, skipkeys=False, ensure\_ascii=True, check\_circular=True, allow\_nan=True, cls=None, indent=None, separators=None, encoding=“utf-8”, default=None, sort\_keys=False, \*\*kw)
    
    
    参数说明如下:
    
    
    * obj:要转换为 JSON 数据的 Python 对象;
    * skipkeys:默认值为 False,如果 dict 中 keys 内的数据不是 Python 的基本类型(str、unicode、int、long、float、bool、None),会报 TypeError 错误,若设置为 True,则会跳过这类 key;
    * ensure\_ascii:默认值 True,即输出 ASCLL 码,若设置为 False,则可以输出中文;
    * check\_circular:如果值为 False,则跳过对容器类型的循环引用检查,循环引用将导致溢出错误;
    * allow\_nan:默认值 True,在处理 JSON 规范以外的 Float 类型时(例如:nan、inf、-inf),将其转换为 JavaScript 中的等价类型(例如:NaN、Infinity、-Infinity),若设置为 False,则会引发一个 ValueError 错误,
    * cls:用来指定一个自定义的 JSONEncoder 子类,来替换 JSONCoder 类;
    * indent:按照给定数值,将数据缩进显示,让数据读起来更加清晰;
    * separators:分隔符,分别设置不同 dict 项之间的分隔符和 dict 项内 key 与 value 之间的分隔符,并将冒号`:`与逗号`,`之后的空格全部去除;
    * encoding:设置 JSON 数据的编码方式,默认为 UTF-8;
    * default:指定一个函数,当某个对象无法被序列化时会调用该函数;
    * sort\_keys:若值为 Ture,则表示按照 dict 排序(a 到 z)输出。
    
    
    示例代码如下:
    
    
    
    

    import json
    dictionary = {“title”:“JSON教程”,“author”:“C语言中文网”,“url”:“http://c.biancheng.net/”,“catalogue”:[“JSON是什么?”,“JSONP是什么?”,“JSON语法规则”]}
    jsonString = json.dumps(dictionary, indent=4, ensure_ascii=False)
    print(jsonString)

    
    运行结果如下:
    
    
    {  
     “title”: “JSON教程”,  
     “author”: “C语言中文网”,  
     “url”: “http://c.biancheng.net/”,  
     “catalogue”: [  
     “JSON是什么?”,  
     “JSONP是什么?”,  
     “JSON语法规则”  
     ]  
     }
    
    
    ### json.loads()
    
    
    在 Python 中,您可以使用 json.loads() 函数将 JSON 数据转换为 Python 对象,语法格式如下:
    
    
    json.loads(s[, encoding[, cls[, object\_hook[, parse\_float[, parse\_int[, parse\_constant[, object\_pairs\_hook[, \*\*kw]]]]]]]])
    
    
    参数说明如下:
    
    
    * s:要转换的 JSON 数据,可以是 str、bytes 或 bytearray 等类型;
    * encoding:可选参数,设置 JSON 数据的编码方式,默认为 UTF-8;
    * cls:可选参数,用于指定一个自定义 JSONCoder 的子类,来替换 JSONCoder 类;
    * object\_hook:可选参数,将函数的返回值替换为指定的类型,该功能可以用来实现自定义解码器,例如 JSON-RPC;
    * parse\_float:可选参数,如果指定该参数,那么在解码 JSON 数据时,符合 float 类型的字符串将转换为指定的类型;
    * parse\_int:可选参数,如果指定该参数,那么在解码 JSON 数据时,符合 int 类型的字符串将转换为指定的类型;
    * parse\_constant:可选参数,如果指定该参数,那么在解码 JSON 数据时,若出现 -Infinity、Infinity、NaN 等字符串,则调用指定的方法;
    * object\_pairs\_hook:可选参数,将结果以 key-value 有序列表的形式返回,如果 object\_hook 和 object\_pairs\_hook 同时指定的话,优先按照 object\_pairs\_hook 的设置返回。
    
    
    示例代码如下:
    
    
    
    

    import json
    json_str = ‘{“title”:“JSON教程”,“author”:“C语言中文网”,“url”:“http://c.biancheng.net/”,“catalogue”:[“JSON是什么?”,“JSONP是什么?”,“JSON语法规则”]}’
    data = json.loads(json_str)
    print(data)

    
    运行结果如下:
    
    
    {‘title’: ‘JSON教程’, ‘author’: ‘C语言中文网’, ‘url’: ‘http://c.biancheng.net/’, ‘catalogue’: [‘JSON是什么?’, ‘JSONP是 什么?’, ‘JSON语法规则’]}
    
    
    ## Java JSON的解析和创建
    
    
    几乎所有的编程语言例如:Java、Python、Node.js、JavaScript 和 Ruby 等都提供了创建和解析 JSON 数据的方法,本节我们主要来介绍一下如何使用 Java 来创建和解析 JSON 数据。
    
    
    Java 中没有内置任何处理 JSON 数据的函数或库,所以我们需要借助一些开源的库来实现 JSON 数据的创建和解析,比较常用的有 JSON.simple、Jackson、Gson、Moshi 等,接下来以 JSON.simple 为例,来演示一下如何使用 Java 来创建和解析 JSON 数据。
    
    
    ### 使用 Java 创建 JSON 数据
    
    
    在 Java 中,您可以使用 JSONObject 来将 Java 数据转换为 JSON 格式,示例代码如下:
    
    
    
    

    import org.json.simple.JSONObject;
    class JsonEncodeDemo {
    public static void main(String[] args) {
    JSONObject obj = new JSONObject();

        obj.put("title", "JSON教程");
        obj.put("author", "C语言中文网");
        obj.put("url", "http://c.biancheng.net/");
        obj.put("hits", 100);
    
        System.out.print(obj);
    }
    

    }

    
    编译并执行上述程序,结果如下:
    
    
    {“hits”:100,“author”:“C语言中文网”,“title”:“JSON教程”,“url”:“http://c.biancheng.net/”}
    
    
    ### 使用 Java 解析 JSON 数据
    
    
    在 Java 中,您可以使用 JSONObjcet 和 JSONArray 来将 JSON 数据解析为 Java 对象,示例代码如下:
    
    
    
    

    import org.json.simple.JSONObject;
    import org.json.simple.JSONArray;
    import org.json.simple.parser.ParseException;
    import org.json.simple.parser.JSONParser;
    class JsonDecodeDemo {
    public static void main(String[] args) {
    JSONParser parser = new JSONParser();
    String s = “[0,{“hits”:100,“author”:“C语言中文网”,“title”:“JSON教程”,“url”:“http://c.biancheng.net/”}]”;
    try{
    Object obj = parser.parse(s);
    JSONArray array = (JSONArray)obj;
    System.out.println(array.get(1));
    System.out.println();
    }catch(ParseException pe) {
    System.out.println("position: " + pe.getPosition());
    System.out.println(pe);
    }
    }
    }

    
    编译并执行上述程序,结果如下:
    
    
    {“hits”:100,“author”:“C语言中文网”,“title”:“JSON教程”,“url”:“http://c.biancheng.net/”}
    
    
    ## Ajax获取JSON数据
    
    
    Ajax 全称“Asynchronous JavaScript and XML”,译为“异步 JavaScript 和 XML”,程序员们习惯称之为“阿贾克斯”,通过 Ajax 我们可以异步在服务器与客户端之间传递数据。在 Ajax 中,普遍使用 JSON 作为传输数据的格式。
    
    
    一般情况下,我们可以通过 JavaScript 来发送 Ajax 请求,并接收响应的信息。下面通过一个示例来演示一下(有关 Ajax 的详细介绍大家可以查阅《[JavaScript Ajax请求]( )》一节):
    
    
    
    
    AJAX And JSON
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值