json介绍
json数据格式
json数据在线解析
https://www.json.cn/网站可以验证一个json格式的数据是否正确。尤其是在我们编写比较复杂的json格式数据时,很有用。
json序列化
json序列化是指,将有key-value结构的数据类型(比如结构体、map、切片序列化成json字符串的操作。应用案例这里我们介绍一下结构体、map和切片的序列化,其它数据类型的序列化类似。
package main
import (
"encoding/json"
"fmt"
)
//结构体的序列化
type Monster struct {
Name string
Age int
Birthday string
Scal float64
Skill string
}
func testStruct(){
monster:=Monster{
Name: "牛魔王",
Age: 500,
Birthday: "2011-11-11",
Scal: 8000.0,
Skill: "牛魔拳",
}
bytes, err := json.Marshal(monster)
if err!=nil{
fmt.Println("序列化失败",err)
}else{
fmt.Printf("序列化后的结果=%v \n",string(bytes))
}
}
//map的序列化
func testMap(){
var a map[string]interface{}
a=make(map[string]interface{})
a["name"]="红孩儿"
a["age"]="30"
a["address"]="洪崖洞"
bytes, err := json.Marshal(a)
if err!=nil{
fmt.Println("序列化失败",err)
}else{
fmt.Printf("序列化后的结果=%v \n",string(bytes))
}
}
//切片序列化
func testSlice(){
var slice []map[string]interface{}
var m1 map[string]interface{}
m1=make(map[string]interface{})
m1["name"]="jack"
m1["age"]="7"
m1["address"]="英国"
slice=append(slice,m1)
var m2 map[string]interface{}
m2=make(map[string]interface{})
m2["name"]="tom"
m2["age"]="70"
m2["address"]="美国"
slice=append(slice,m2)
bytes, err := json.Marshal(slice)
if err!=nil{
fmt.Println("序列化失败",err)
}else{
fmt.Printf("序列化后的结果=%v \n",string(bytes))
}
}
//基本数据的序列化
func testFloat64(){
var num float64=410.32
bytes, err := json.Marshal(num)
if err!=nil{
fmt.Println("序列化失败",err)
}else{
fmt.Printf("序列化后的结果=%v \n",string(bytes))
}
}
func main() {
//testStruct()
//testMap()
testSlice()
//testFloat64()
}
对于结构体的序列化,如果我们希望序列化后的key的名字,又我们自己重新制定,那么可以给struct指定一个tag标签
结果
json反序列化
json反序列化是指,将json字符串反序列化成对应的数据类型(比如结构体、map、切片)的操作
package main
import (
"encoding/json"
"fmt"
)
//结构体的序列化
type Monster struct {
Name string
Age int
Birthday string
Scal float64
Skill string
}
//反序列化Struct
func unmarshalStruct(){
str:="{\"Name\":\"牛魔王2222\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}"
var m Monster
err := json.Unmarshal([]byte(str), &m)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v", m)
}
func main() {
unmarshalStruct()
结果