一、什么是JSON

    JSON全称JavaScript Object Notation(JS对象标记),是一种轻量级的数据交换格式。它相对于XML更小、更易于人阅读和编写,同时也易于机器解析和生存,并有效地提高网络传输效率。

 

二、JSON数据格式

    1、整体结构

        String json1 = {"name" : "Jack","sex" : "男"}

        String json2 = [{"name" : "Jack","sex" : "男"},{"name" : "Vincent","sex": "男"}]

 

    2、JSON对象------左花括号({ )开头,右花括号(})结尾,一个键值对为一个属性

        Json对象结构:{key1:value1,key2:value2...}

                a)、key的数据类型:字符串

                b)、value的数据类型:字符串、数值、null、json数组[]、json对象{}

 

    3、JSON数组------类似数组或序列

        JSON数组结构:[value1,value2......]

                a)、value的数据类型:字符串、数值、null、json数组[]、json对象{}

 

    语法规则:

        1)、数据在名称/值中,为一个键值对,表示的是对象的属性

        2)、除了最后一个属性或对象,每个属性,每个对象都必须用逗号(,)分隔

        3)、花括号({})保存对象,一对花括号表示一个对象

        4)、方括号([])保存数组,一对方括号表示一个数组

 

三、JSON的语法

    1)、JSON对象

        JSON对象是在花括号中书写的,对象中可以包含多个属性,多个属性之间用逗号(,)隔开。

     格式:{"name":"Vincent","sex":"男"}

 

    2)、JSON 对象的属性

        JSON对象属性的书写格式为:名称:值,是一个键值对。官方规定,在JSON字符串中,JSON的Key值必须用双引号标起来,而不是单引号或无引号。

     格式:"name":"Vincent"

 

    3)、JSON数组

        JSON对象中可以包含多个数组,用方括号([])将对象或属性包含在其中

{
	"user":[{ "name":"Vincent" , "sex":"男" },
		{ "name":"Jack" , "sex":"男" },
		{ "name":"Tom" , "sex": "男" }]
}

 

    4)、JSON中使用JavaScript语法

        a、通过JavaScript,创建一个JSON对象数组

var user = [{ "name":"Vincent" , "sex":"男" },
	    { "name":"Jack" , "sex":"男" },
	    { "name":"Tom" , "sex": "男" }];

 

        b、每一个JSON对象都存储在递增的数组下标中,通过下标去访问该对象的属性

        代码:user[0].name

        结果:Vincnet

 

        c、获取指定下标中的JSON对象之后,我门还可以修改其属性值

        代码:user[0].name = "Jobs";

 

四、JSON的优缺点

        1、XML和JSON的区别

<addressbook>  
	<name>Mary Lebow</name>  
	<address>    
	    <street>5 Main Street</street>  
	    <city> San Diego, CA </city>  
	    <zip> 91912 </zip>  
	    <phoneNumbers>  
	    	<phone>619 332-3452</phone>  
	    	<phone>664 223-4667</phone>  
	    </phoneNumbers>  
	</address>  
</addressbook>
{
	"addressbook":{"name":"Mary Lebow",
		       "address":{"street":"5 Main Street",
				  "city":"San Diego, CA",
				  "zip":"91912",
				  "phoneNumbers":["619 332-3452","664 223-4667"]
				 }
	
		      }
}

   从上面的介绍和代码我们大致可以看出JSON的优缺点

        1)、优点

            a)、数据体积小,轻量级的数据交换

            b)、程序员编写更加容易

            c)、相对XML,JSON不需要考虑子父节点,更易于机器的解析和生成

            d)、JSON支持多种编程语言,例如:Java、JavaScript、PHP、Python、C、C#等等

        2)、缺点

            a)、语法上过于严谨

            b)、代码对数据的描述性差

            c)、代码不宜读

 

五、JSON的解析

    1、转换关系

        服务端:Java对象(包括集合) → JSON字符串

        客户端:JSON字符串 → Java对象(包括集合)  or  JSON字符串 → JS对象

    注意:{"name":"Vincent"}该语句表示的是JSON字符串,而{name:"Vincent"}表示的是JSON对象。前者无法直接输出

 

    2、JSON字符串 和 JSON对象的区别

            JSON字符串:仅仅是一个符合JSON格式的字符串,无法获取其属性值,类型为String

            JSON对象:一个符合JS对象的JSON实例化对象,可以通过指定属性获取其值,类型为Object

             

Json数据类型 mysql8 json数据类型定义_什么是JSON

 

    3、JSON字符串 和 JSON对象的转换

JSON.parse()方法

                

Json数据类型 mysql8 json数据类型定义_JSON详解_02

        b)、JSON对象 转 JSON字符串  ------  调用JSON.stringify()方法

                

Json数据类型 mysql8 json数据类型定义_JSON基础_03

 

六、JSON字符串  和 JSON对象的关系

 

JSON字符串:用于"传输"或"存储JSON数据"。传输或存储过程中,JSON对象处理之后序列化为JSON字符串,之后传递到"前端"、"处理类"、"数据库"中或通过"TCP/IP协议"发送出去。

JSON对象:用于输出具体对象属性值。程序获取传递过来的JSON字符串是无法操作的,只能用于传递或输出字符串。所以我们需要通过指定方法,将JSON字符串转换为Objec类型的JSON对象,之后JSON对象通过指定属性获取该属性值。

 

七、JSON对象 和 JSON字符串的语法规范

        1、JSON对象语法规范:

//【1】、JS创建JSON对象
var num1 = {"id":"1","name":"vincent","sex":"男","age":"20"};
var num2 = {id:"1",name:"vincent","sex":"男","age":"20"};
var num3 = {id:"1",name:"vincent",sex:"男",age:"20"};
console.log(num1);		//输出该对象
console.log(num2);		//输出该对象
console.log(num3);		//输出该对象
console.log("对象num2中id = "+num2.id+" 的数据类型为:"+typeof(num2.id));	//输出该对象的数据类型
				
//比较对象之间是否相等
console.log(num1 == num2);
console.log(num1 == num3);
console.log(num2 == num3);
var num4 = {"id":"1","name":"vincent","sex":"男","age":"20"};
console.log(num1 == num4);

                对象中的属性名称均为String的数据类型,所以无论你加不加冒号,在程序中均是String类型的属性名,故可以看出对象num1 = 相对num2 = 对象num3,当然这是形式上的相等。但实际上,我们每创建一个对象,都会创建一个存储区给对象,每个对象的实际地址在栈中是不一样的,所以三个对象之间彼此不相等。即使创建一模一样的对象num4也亦是如此。

Json数据类型 mysql8 json数据类型定义_Json数据类型 mysql8_04

 

        2、JSON字符串语法规范

//【2】、JS创建JSON字符串
var sum = '{"id":"2","name":"vincent","sex":"男","age":"20"}';
console.log(sum);			//输出该对象
console.log("数据类型:"+typeof(sum));		//输出该对象的数据类型
				
console.log("------------------------------分界线---------------------------------");
				
//【3】、JSON字符串 转 JSON对象
var sums = '{"id":"4","name":"vincent","sex":"男","age":"20"}';
var sumC = JSON.parse(sums);
console.log(sumC);			//输出该对象
console.log(typeof(sumC));		//输出该对象的数据类型
				
//【错误】、JSON字符串 转 JSON对象
var sums = '{id:"4",name:"vincent","sex":"男","age":"20"}';
var sumC = JSON.parse(sums);
console.log(sumC);			//输出该对象
console.log(typeof(sumC));		//输出该对象的数据类型

                JSON字符串其实就是一个普通的字符同,不同的是他满足JSON的语法规范而已。官方规定JSON字符串的键值对必须都包括在冒号("")之中,这是一个用于识别JSON语句的语法规范。当字符串在没有反序列化时就是一个普通的字符串,所以加不加冒号都无所谓,但是当使用JSON.stringify()方法时,表示的是将JSON字符串序列化为JSON对象,此时如果字符串不符合JSON的语法规范则会报错。

            

Json数据类型 mysql8 json数据类型定义_JSON基础_05

            从图中可以看出,由于错误的范例中,属性id和name均没有用双引号标起来,所以在反序列化的过程中,程序会判断为普通的字符串,而非JSON字符串,所以报错。

 

八、扩展

序列化?

对象“转换”为字节序列的过程称为对象的序列化

          b)、什么是反序列化?

字节序列“恢复”为对象的过程称为对象的反序列化。

        解释:序列化(Serialization)就是将对象的状态信息转换为可以传输或存储的字节序列形式。在序列化期间,对象将其状态写入到临时或持久性存储区。以后,可以通过存储区中读取或反序列化为对象状态,重新创建该对象。

 

        c)、底层如何实现序列化?

                ------------------------以后补充,感兴趣的可以自行了解-----------------------