一、什么是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
3、JSON字符串 和 JSON对象的转换
JSON.parse()方法
b)、JSON对象 转 JSON字符串 ------ 调用JSON.stringify()方法
六、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也亦是如此。
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的语法规范则会报错。
从图中可以看出,由于错误的范例中,属性id和name均没有用双引号标起来,所以在反序列化的过程中,程序会判断为普通的字符串,而非JSON字符串,所以报错。
八、扩展
序列化?
对象“转换”为字节序列的过程称为对象的序列化
b)、什么是反序列化?
字节序列“恢复”为对象的过程称为对象的反序列化。
解释:序列化(Serialization)就是将对象的状态信息转换为可以传输或存储的字节序列形式。在序列化期间,对象将其状态写入到临时或持久性存储区。以后,可以通过存储区中读取或反序列化为对象状态,重新创建该对象。
c)、底层如何实现序列化?
------------------------以后补充,感兴趣的可以自行了解-----------------------