[TOC]
>[success] ## **1:json(JavaScript Object Notation)**
### **1.1:json基本介绍**
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。key-val
JSON是在2001年开始推广使用的数据格式,目前已经成为主流的数据格式。
JSON易于机器解析和生成,并有效地提升**网络传输效率**,通常程序在网络传输时会先将**数据(结构体、map等)序列化成json字符串到接收方得到json字符串时,在反序列化恢复成原来的数据类型(结构体、map等)** 这种方式已然成为各个语言的标准。
![](https://img.kancloud.cn/5b/ad/5bad5dcf7ba0dd8229b17fd18590688e_1280x497.png)
### **1.2:json数据格式**
在JS语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等.
JSON键值对是用来保存数据一种方式,
键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,然后紧接着值:
```
{
"code":1,
"msg":"success",
"data":{
"name":"pig",
"age":"18",
"sex":"man",
"hometown":{
"province":"江西省",
"city":"抚州市",
"county":"崇仁县"
}
}
}
```
### **1.3:Marshal()与unmarshal**
Json Marshal:将数据编码成json字符串(序列化)
Json Unmarshal:将json字符串解码到相应的数据结构(反序列化)
**应用实例如下**:
![](https://img.kancloud.cn/0c/59/0c59ae077c44af12f041e26aa154560b_1280x353.png)
![](https://img.kancloud.cn/94/88/94885bf56f65ad759df044755bd7944a_1280x302.png)
![](https://img.kancloud.cn/f4/6a/f46ac35c557714926a39c144590b41f5_909x720.png)
<br>
<br>
### **1.4:使用json tag指定字段名**
序列化与反序列化默认情况下使用结构体的字段名,我们可以通过给结构体字段添加tag来指定json序列化生成的字段名
案例如下:
![](https://img.kancloud.cn/bb/a8/bba83a03a7561ba64dfb65e7e5cce757_1280x250.png)
### **1.5:json的序列化**
json序列化是指,将有**key-value** 结构的数据类型(比如结构体、map、切片)序列化成json字符串
这里我们介绍一下**结构**体,**map**和**切片**的序列化
**序列化方法:官网解释如下:**
**func [Marshal]**
**func Marshal(v interface{}) (\[\]byte, error)**
Marshal函数返回v的json编码。
Marshal函数会递归的处理值。如果一个值实现了Marshaler接口切非nil指针,会调用其MarshalJSON方法来生成json编码。nil指针异常并不是严格必需的,但会模拟与UnmarshalJSON的行为类似的必需的异常。
否则,Marshal函数使用下面的基于类型的默认编码格式:
布尔类型编码为json布尔类型。
浮点数、整数和Number类型的值编码为json数字类型。
字符串编码为json字符串。角括号""会转义为"\\u003c"和"\\u003e"以避免某些浏览器吧json输出错误理解为HTML。基于同样的原因,"&"转义为"\\u0026"。
数组和切片类型的值编码为json数组,但\[\]byte编码为base64编码字符串,nil切片编码为null。
结构体的值编码为json对象。每一个导出字段变成该对象的一个成员。
* [ ] 自己解释:Marshal方法接受一个interface,而我们在学方法时曾说过,接受类型是**interface可以接受任何数据类型**,Marshal方法返回两个参数,**一个byte切片,一个error报错**
* [ ] **注意:Marshal内部会做一个判断,如果该v中的字段可以用则序列化,不可以用(例如小写)则不取出--------Marshal内部有反射机制**
#### **1.5.1:结构体序列化:**
![](https://img.kancloud.cn/47/5d/475d432f1c73d126e584fc60bf858e4e_1280x709.png)
#### **1.5.2:map序列化**
![](https://img.kancloud.cn/41/b6/41b687a7d8caa82b9238d17753e8d2ea_1280x465.png)
#### **1.5.3:Slice序列化**
![](https://img.kancloud.cn/9a/6c/9a6c9d51e3681465169a9205529d3c10_1022x720.png)
<br>
<br>
>[success] ## **2:json之反序列化Unmarshal**
<br>
### **1:基本概念:**
* [ ] **反序列化介绍**
json反序列化是指,将json字符串反序列化成对应的数据类型(比如结构体、map、
切片)的操作。
* [ ] **Json.Unmarshal()**
<br>
### **2:反序列化结构体**
在反序列化中,例如要把json字符串反序列化成结构体,那必须要定义一个结构体,字段和数据类型相同的结构体,才可以
![](https://img.kancloud.cn/0a/5e/0a5ea147a8d1db3a92933fd419d0b50e_1280x713.png)
<br>
### **3:反序列化map**
注意:在使用map反序列化时,不需要make,因为Unmarshal在执行中,会监测到如果是map它内部会自动make,所以不需要自己手动在make一下
![](https://img.kancloud.cn/63/1d/631d73a85eb7554c325209e1d481abc6_1440x900.png)
<br>
<br>
### **4:反序列化slice**
![](https://img.kancloud.cn/6f/31/6f31cbc04dd594af8ac137b828a5728b_1419x720.png)
```
package main
import(
"fmt"
"encoding/json"
)
func unmarshalslice(){
num := "[{\"address\":\"武当山\",\"age\":\"800\",\"name\":\"张三丰\"},"+"{\"address\":\"云游四海\",\"age\":\"29\",\"city\":[\"上海\",\"北京\",\"西藏\"],\"name\":\"令狐冲\"}]"
var slice []map[string]interface{}
// 反序列化,不需要make,因为make这个操作被封装到Unmarshal函数里
err := json.Unmarshal([]byte(num),&slice)
if err != nil{
fmt.Println("切片反序列化失败")
}
fmt.Println(slice)
}
func main(){
unmarshalslice()
}
```
<br>
<br>
### **4:反序列化总结:**
* [ ] json字符串反序列化中,要确保,**反序列化数据类型**和原来的**数据类型一致**
* [ ] 通过程序获取不要转译字符【\\】
- Golang语言之旅
- 第一章:初始小节以及安装
- 一:Golang语言特性
- 二:Windows上安装Go语言开发包
- 三:在Mac OS上安装Go语言开发包
- 第二章:GO语言注意事项
- 一:Dos的常用指令
- 第三章:Go初识小菜
- 一:Go语言之变量与常量
- 二:Go内置值-引用类型
- 三:基本的数据类型
- 四:字符串(char)
- 五:布尔类型(bool)
- 六:字符串类型(string)
- 七:基本数据类型的默认值
- 八:基本数据类型的互相转换
- 九:基本数据类型和string类型的相互转换
- 十:Golang指针
- 十一:值类型和引用类型
- 十二:标识符和命名规范
- 十三:系统保留关键字and预定义标识符
- 十四:fmt常用方法解析
- 第四章:Go运算符
- 一:运算符的基本介绍
- 二:算术运算符
- 2.1:算数运算符细节
- 三:关系运算符
- 3.1:关系运算符细节
- 四:逻辑运算符
- 4.1:逻辑运算符细节及案例
- 五:Go赋值运算符
- 5.1:案例演示赋值运算符的基本使用
- 5.2:赋值运算符的特点
- 六:Go位运算符
- 七:其他运算符
- 八:运算符的优先级
- 九:控制台输入语句
- 十:进制
- 十一:位运算
- 第五章:流程控制大纲
- 一:if语句
- 二:switch语句
- 三:for循环
- 第六章:函数-包-错误处理
- 一:Go函数
- 二:Go包
- 三:匿名函数
- 四:闭包
- 五:函数defer
- 六:函数参数的传递方式
- 七:变量的作用域
- 八:时间和日期相关函数
- 九:new和recover异常
- 十:数组(Array)切片(Section)
- 十一:切片(slice)
- 十二:3 数组的排序和查找
- 第七章:Map
- 第一节:Map基础认识
- 第二节:Map初始化和make
- 第三节:Map增删改查
- 第四节:Map的切片
- 第五节:Map的注意事项
- 第八章:面向对象(上)
- 第一节:结构体(值类型)
- 第二节:方法
- 第三节:面向对象编程应用实例
- 第九章:面向对象(下)
- 第一节:面向对象之抽象
- 第二节:面向对象之继承
- 第三节:面向对象之多态
- 第四节:接口
- 第十章:文件操作
- 第一节:文件基本介绍
- 第二季:写文件实例操作
- 第三节:JSON
- 第十一章:单元测试
- 第一节:单元测试介绍
- 第二节:单元测试案例
- 第三节:单元测试总结
- 第四节:单元测试案例
- 第十二章:goroutine和channel
- 第一节:goroutine基本介绍
- 第二节:goroutine入门案例
- 第三节:goroutione调度模型
- 第四节:Golang设置运行的CPU数量
- 第十二章:channel
- 第一节:channel基本介绍
- 第二节:channel基本使用
- 第三节:channel案例演示
- 第四节:channel 使用的注意事项
- 第五节:channel练习题
- 第六节:channel的遍历和关闭
- 第七节:goroutione和channel结合
- 第八节:channel细节处理
- 第十二章:并发模式
- 第十三章:反射reflect
- 第一节:反射基本介绍
- 第二节:反射重要的函数和概念
- 第三节:反射快速入门案例
- 第四节:反射注意事项
- 第五节:反射练习题
- 第六节:反射最佳实践