前言
通过本篇博客,我会和大家一起学习Json的操作,我们会在简单认识Json后通过一个小案例来让大家更清晰的认识和操作Json,希望本篇博客能为大家的工作过程中带来一些帮助与启发。
若当前文章对你有所帮助,欢迎关注微信公众号小小Unity,我会定期在微信公众号上发布一些关于Unity的专栏知识与一些开发资源
1.1 初识JSON
21世纪初,Douglas Crockford寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是XML,但是Douglas Crockford觉得XML的生成和解析都太麻烦,所以他提出了一种简化格式,也就是Json。
Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。
1) 并列的数据之间用逗号(", ")分隔。
2) 映射用冒号(": ")表示。
3) 并列数据的集合(数组)用方括号("[]")表示。
4) 映射的集合(对象)用大括号("{}")表示。
上面四条规则,就是Json格式的所有内容。
比如,下面这句话:
"北京市的面积为16800平方公里,常住人口1600万人。上海市的面积为6400平方公里,常住人口1800万。"
写成json格式就是这样:
[
{"城市":"北京","面积":16800,"人口":1600},
{"城市":"上海","面积":6400,"人口":1800}
]
如果事先知道数据的结构,上面的写法还可以进一步简化:
[
["北京",16800,1600],
["上海",6400,1800]
]
由此可以看到,json非常易学易用。所以,在短短几年中,它就取代xml,成为了互联网上最受欢迎的数据交换格式。
1.1.1 JSON 语法规则
JSON 语法是 JavaScript 对象表示法语法的子集。
-
数据在名称/值对中
-
数据由逗号分隔
-
花括号保存对象
-
方括号保存数组
1.1.2 JSON 名称/值对
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"firstName" : "John"
这很容易理解,等价于这条 JavaScript 语句:
firstName = "John"
1.1.3 JSON 值
JSON 值可以是:
-
数字(整数或浮点数)
-
字符串(在双引号中)
-
逻辑值(true 或 false)
-
数组(在方括号中)
-
对象(在花括号中)
-
null
1.1.4 JSON 对象
JSON 对象在花括号中书写:
对象可以包含多个名称/值对:
{ "firstName":"John" , "lastName":"Doe" }
这一点也容易理解,与这条 JavaScript 语句等价:
firstName = "John"
lastName = "Doe"
1.1.5 JSON 数组
JSON 数组在方括号中书写:
数组可包含多个对象:
{
"employees":
[
{
"firstName": "John",
"lastName": "Doe"
},
{
"firstName": "Anna",
"lastName": "Smith"
},
{
"firstName": "Peter",
"lastName": "Jones"
}
]
}
在上面的例子中,对象 “employees” 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。
1.2 JSON实例
1.数组方式 [ ]
[
{
"id": 1,
"name": "xiaoming"
},
{
"id": 2,
"name": "xiaohong"
}
]
2.对象方式 { }
{
"status": 0,
"msg": "SUCCESS",
"data": [
{
"id": 1,
"name": "xiaohong"
},
{
"id": 2,
"name": "xiaoming"
}
]
}
3.反例
{"id" : ox16 } //不合法,数值需要是十进制
{"name" : underfined } //不合法,没有该值
[{
"name" : NUll,
"school" : function()
{
console.log("该写法是错误的")
}//不合法
}]//json中不能使用自定义函数,或系统内置函数
4.复合json
{
"project": "Unity精品专栏之序列化Json操作Json",
"projectTime": "s20210105",
"data": {
"searchData": [
{
"elements": [
{
"id": 1001,
"name": "无影剑-艾雷诺",
"icon": "Json/Equip/无影剑-艾雷诺",
"count": 5,
"getPosition": {
"lat": 34.685087,
"lng": 135.805
},
"hasShell": false,
"quality": "史诗",
"price": 95825,
"infomation": "DNF中史诗装备"
},
{
"id": 1002,
"name": "太极天帝剑",
"icon": "Json/Equip/太极天帝剑",
"count": 5,
"getPosition": {
"lat": 14.685087,
"lng": 35.805
},
"hasShell": false,
"quality": "史诗",
"price": 123123,
"infomation": "DNF中史诗装备"
},
{
"id": 1003,
"name": "星之海·罗睺",
"icon": "Json/Equip/星之海·罗睺",
"count": 5,
"getPosition": {
"lat": 14.685087,
"lng": 35.805
},
"hasShell": false,
"quality": "史诗",
"price": 758959,
"infomation": "DNF中史诗装备"
},
{
"id": 1004,
"name": "无尽之刃",
"icon": "Json/Equip/无尽之刃",
"count": 5,
"getPosition": {
"lat": 194.685087,
"lng": 325.805
},
"hasShell": false,
"quality": "史诗",
"price": 9568,
"infomation": "英雄联盟中史诗装备"
},
{
"id": 1005,
"name": "三相之力",
"icon": "Json/Equip/三相之力",
"count": 5,
"getPosition": {
"lat": 134.685087,
"lng": 325.805
},
"hasShell": false,
"quality": "史诗",
"price": 32658,
"infomation": "英雄联盟中史诗装备"
},
{
"id": 1006,
"name": "多兰剑",
"icon": "Json/Equip/多兰剑",
"count": 35,
"getPosition": {
"lat": 13.685087,
"lng": 32.805
},
"hasShell": true,
"quality": "普通",
"price": 126,
"infomation": "英雄联盟中初始装备"
},
{
"id": 1007,
"name": "多兰盾",
"icon": "Json/Equip/多兰盾",
"count": 35,
"getPosition": {
"lat": 3.685087,
"lng": 32.805
},
"hasShell": true,
"quality": "普通",
"price": 256,
"infomation": "英雄联盟中初始装备"
},
{
"id": 1008,
"name": "多兰戒",
"icon": "Json/Equip/多兰戒",
"count": 35,
"getPosition": {
"lat": 59.685087,
"lng": 32.805
},
"hasShell": true,
"quality": "普通",
"price": 300,
"infomation": "英雄联盟中初始装备"
}
],
"type": "Equip",
"title": "热门装备"
},
{
"elements": [
{
"id": 2001,
"name": "频道喇叭",
"icon": "Json/Expoend/频道喇叭",
"count": 35,
"getPosition": {
"lat": 99.685087,
"lng": 32.805
},
"hasShell": true,
"quality": "普通",
"price": 622,
"infomation": "向当前频道的玩家发言"
},
{
"id": 2002,
"name": "命运硬币",
"icon": "Json/Expoend/命运硬币",
"count": 35,
"getPosition": {
"lat": 99.685087,
"lng": 32.805
},
"hasShell": true,
"quality": "普通",
"price": 655,
"infomation": "概率恢复角色人物一定百分比的生命值。"
},
{
"id": 2003,
"name": "红药水",
"icon": "Json/Expoend/红药水",
"count": 35,
"getPosition": {
"lat": 99.685087,
"lng": 32.805
},
"hasShell": true,
"quality": "普通",
"price": 958,
"infomation": "瞬间恢复自身血量"
},
{
"id": 2004,
"name": "蓝药水",
"icon": "Json/Expoend/蓝药水",
"count": 35,
"getPosition": {
"lat": 99.685087,
"lng": 32.805
},
"hasShell": true,
"quality": "普通",
"price": 956,
"infomation": "瞬间恢复自身能量"
},
{
"id": 2005,
"name": "瞬间移动药剂",
"icon": "Json/Expoend/瞬间移动药剂",
"count": 35,
"getPosition": {
"lat": 99.685087,
"lng": 32.805
},
"hasShell": true,
"quality": "普通",
"price": 125,
"infomation": "可通过此药剂瞬间传送到地图的任意位置"
}
],
"type": "Expoend",
"title": "热门消耗品"
}
],
"dateTime": "2021-01-15 10:52:27.811321"
}
}
这一节我们就先到这里,从下节开始我们通过开发一个Demo案例来继续深入学习怎么解析Json以及怎么对Json的数据进行操作
大家下节见