💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[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字符串反序列化中,要确保,**反序列化数据类型**和原来的**数据类型一致** * [ ] 通过程序获取不要转译字符【\\】