[TOC]
>[success] ## **1:json(JavaScript Object Notation)**
### **1.1:json基本介紹**
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。易于人閱讀和編寫。同時也易于機器解析和生成。key-val
JSON是在2001年開始推廣使用的數據格式,目前已經成為主流的數據格式。
JSON易于機器解析和生成,并有效地提升**網絡傳輸效率**,通常程序在網絡傳輸時會先將**數據(結構體、map等)序列化成json字符串到接收方得到json字符串時,在反序列化恢復成原來的數據類型(結構體、map等)** 這種方式已然成為各個語言的標準。

### **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字符串解碼到相應的數據結構(反序列化)
**應用實例如下**:



<br>
<br>
### **1.4:使用json tag指定字段名**
序列化與反序列化默認情況下使用結構體的字段名,我們可以通過給結構體字段添加tag來指定json序列化生成的字段名
案例如下:

### **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:結構體序列化:**

#### **1.5.2:map序列化**

#### **1.5.3:Slice序列化**

<br>
<br>
>[success] ## **2:json之反序列化Unmarshal**
<br>
### **1:基本概念:**
* [ ] **反序列化介紹**
json反序列化是指,將json字符串反序列化成對應的數據類型(比如結構體、map、
切片)的操作。
* [ ] **Json.Unmarshal()**
<br>
### **2:反序列化結構體**
在反序列化中,例如要把json字符串反序列化成結構體,那必須要定義一個結構體,字段和數據類型相同的結構體,才可以

<br>
### **3:反序列化map**
注意:在使用map反序列化時,不需要make,因為Unmarshal在執行中,會監測到如果是map它內部會自動make,所以不需要自己手動在make一下

<br>
<br>
### **4:反序列化slice**

```
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
- 第一節:反射基本介紹
- 第二節:反射重要的函數和概念
- 第三節:反射快速入門案例
- 第四節:反射注意事項
- 第五節:反射練習題
- 第六節:反射最佳實踐