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
原创不易,希望大家多多支持
如果文章对你有帮助,记得一键三连哦!❤️❤️❤️
转载:https://blog.csdn.net/weixin_44736475/article/details/114319772