golang学习之路—json
Posted Casey321
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang学习之路—json相关的知识,希望对你有一定的参考价值。
JSON
JSON基本介绍
JSON(javascript Object Notation)是一种轻量级的数据交换格式。易与人阅读和编写。同时也易于机器解析和生成。
JSON是在2001年开始推广使用的数据格式,目前已经成为主流的数据格式。
JSON易于机器解析和生成,并有效地提升网络输出效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成json字符串,到接收方得到json字符串时,再反序列化恢复成原来的数据类型(结构体、map等)。这种方式已经成为各个语言的标准。
应用场景(示意图)
JSON数据格式说明
在JS语言中,一切都是对象。因此,任何的数据类型都可以通过JSON来表示,例如字符串、数字、对象、数组、map、结构体等。
JSON键值对是用来保存数据的一种方式。键值对组合中的键名写在前面并用双引号“”包裹,使用冒号:分隔,然后紧接着值。
比如:
"name":"Casey","age":18
"name":"Tom","age":28,"address":["广州","上海"
JSON的序列化
json序列化是指,将有key-value结构的数据类型(比如结构体、map、切片等)序列化成json字符串的操作。
应用案例
演示结构体、map和切片的序列化,其它数据类型的序列化类似。
package main
import(
"fmt"
"encoding/json"
)
type Student struct
Name string
Gender string
Age int
//结构体序列化
func testStruct()
stu := Student
Name : "Lily",
Gender:"女",
Age : 20,
//将stu序列化
data,err := json.Marshal(stu)
if err != nil
fmt.Println("序列化错误 err =",err)
else
fmt.Printf("stu struct序列化后 = %v\\n",string(data))
//map序列化
func testMap()
//定义一个map
var a map[string]interface
//使用map,需要make
a = make(map[string]interface)
a["name"] = "Casey"
a["age"] = 18
a["gender"] = "女"
//将a这个map进行序列化
data,err := json.Marshal(a)
if err != nil
fmt.Println("序列化错误 err =",err)
else
fmt.Printf("a map序列化后 = %v\\n",string(data))
//对切片进行序列化
func testSlice()
var slice []map[string]interface
var m map[string]interface
m = make(map[string]interface)
m["name"] = "Casey"
m["age"] = 20
m["gender"] = "女"
slice = append(slice,m)
var m1 map[string]interface
m1 = make(map[string]interface)
m1["name"] = "Tom"
m1["age"] = 22
m1["gender"] = "男"
slice = append(slice,m1)
//将切片进行序列化操作
data,err := json.Marshal(slice)
if err != nil
fmt.Printf("序列化错误 err= %v\\n",err)
else
fmt.Printf("slice 序列化后 = %v\\n",string(data))
func main()
testStruct()
testMap()
testSlice()
运行结果:
注意事项:
对于结构体的序列化,如果我们希望序列化后的key的名字,可以由我们自己制定,那么可以给struct制定一个tag标签。
type Student struct
Name string `json:"stu_name"`
Gender string `json:"stu_gender"`
Age int `json:"stu_age"`
运行结果:
JSON的反序列化
json反序列化是指,将json字符串反序列化成对应的数据类型(比如结构体、map、切片等)的操作。
应用案例
演示将json字符串反序列化成结构体、map、切片。
代码演示:
package main
import(
"fmt"
"encoding/json"
)
type Student struct
Name string
Gender string
Age int
//结构体反序列化
func umarshalStruct()
//str在项目开发中,是通过网络传输获取到,或者是读取文件等获取到的
str := "\\"Name\\":\\"Casey\\",\\"age\\":18,\\"gender\\":\\"女\\""
//定义一个Student实例
var stu Student
//将stu序列化
err := json.Unmarshal([]byte(str),&stu)
if err != nil
fmt.Println("反序列化错误 err =",err)
else
fmt.Printf("struct反序列后 = %v\\n",stu)
//map反序列化
func unmarshalMap()
str := "\\"Name\\":\\"Tom\\",\\"age\\":22,\\"gender\\":\\"男\\""
//定义一个map
var a map[string]interface
//反序列化map不需要make,因为make操作被封装到Unmarshal函数中
err := json.Unmarshal([]byte(str),&a)
if err != nil
fmt.Println("反序列化错误 err =",err)
else
fmt.Printf("map反序列后 = %v\\n",a)
//对切片进行反序列化
func unmarshalSlice()
str := "[\\"Name\\":\\"Tom\\",\\"age\\":22,\\"gender\\":\\"男\\"," +
"\\"Name\\":\\"Jessical\\",\\"age\\":21,\\"gender\\":\\"女\\"]"
var slice []map[string]interface
//反序列化slice不需要make,因为make操作被封装到Unmarshal函数中
//将切片进行反序列化操作
err := json.Unmarshal([]byte(str),&slice)
if err != nil
fmt.Println("反序列化错误 err =",err)
else
fmt.Printf("slice反序列后 = %v\\n",slice)
func main()
umarshalStruct()
unmarshalMap()
unmarshalSlice()
运行结果:
说明:
- 在反序列化一个json字符串是,要确保反序列化后的数据类型和原来序列化前的数据类型一致。
- 如果json字符串是通过程序获取到的,则不需要对"转义处理。
博主首页链接:https://blog.csdn.net/weixin_44736475
原创不易,希望大家多多支持
如果文章对你有帮助,记得一键三连哦!❤️❤️❤️
以上是关于golang学习之路—json的主要内容,如果未能解决你的问题,请参考以下文章