一、Json和struct互換
(1)Json轉(zhuǎn)struct例子:
package main
import (
"fmt"
"encoding/json"
)
type People struct {
Name string `json:"name_title"`
Age int `json:"age_size"`
}
func JsonToStructDemo(){
jsonStr := `
{
"name_title": "jqw"
"age_size":12
}
`
var people People
json.Unmarshal([]byte(jsonStr), people)
fmt.Println(people)
}
func main(){
JsonToStructDemo()
}
輸出:
![](/d/20211017/9e2971ec04bd0bea37752b4dc8cf193a.gif)
注意json里面的key和struct里面的key要一致,struct中的key的首字母必須大寫,而json中大小寫都可以。
(2)struct轉(zhuǎn)json
在結(jié)構(gòu)體中引入tag標(biāo)簽,這樣匹配的時候json串對應(yīng)的字段名需要與tag標(biāo)簽中定義的字段名匹配,當(dāng)然tag中定義的名稱不需要首字母大寫,且對應(yīng)的json串中字段名仍然大小寫不敏感。此時,結(jié)構(gòu)體中對應(yīng)的字段名可以不用和匹配的一致,但是首字母必須大寫,只有大寫才是可對外提供訪問的。
例子:
package main
import (
"fmt"
"encoding/json"
)
type People struct {
Name string `json:"name_title"`
Age int `json:"age_size"`
}
func StructToJsonDemo(){
p := People{
Name: "jqw",
Age: 18,
}
jsonBytes, err := json.Marshal(p)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(jsonBytes))
}
func main(){
StructToJsonDemo()
}
輸出:
![](/d/20211017/3b360e63051c2ede8d3c203379a363a9.gif)
二、json和map互轉(zhuǎn)
(1)json轉(zhuǎn)map例子:
func JsonToMapDemo(){
jsonStr := `
{
"name": "jqw",
"age": 18
}
`
var mapResult map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), mapResult)
if err != nil {
fmt.Println("JsonToMapDemo err: ", err)
}
fmt.Println(mapResult)
}
輸出:
![](/d/20211017/f1422aba16ad2dc684fa580cd77e71a0.gif)
(2)map轉(zhuǎn)Json例子
func MapToJsonDemo1(){
mapInstances := []map[string]interface{}{}
instance_1 := map[string]interface{}{"name": "John", "age": 10}
instance_2 := map[string]interface{}{"name": "Alex", "age": 12}
mapInstances = append(mapInstances, instance_1, instance_2)
jsonStr, err := json.Marshal(mapInstances)
if err != nil {
fmt.Println("MapToJsonDemo err: ", err)
}
fmt.Println(string(jsonStr))
}
輸出:
![](/d/20211017/b122a3ff467adeeb3396fe461d910347.gif)
例2:
func MapToJsonDemo2(){
b, _ := json.Marshal(map[string]int{"test":1, "try":2})
fmt.Println(string(b))
}
輸出:
![](/d/20211017/cfb19bdfbcaf454839fdeb036762a6cc.gif)
三、map和struct互轉(zhuǎn)
(1)map轉(zhuǎn)struct
需要安裝一個第三方庫
在命令行中運(yùn)行:
go get github.com/goinggo/mapstructure
例子:
func MapToStructDemo(){
mapInstance := make(map[string]interface{})
mapInstance["Name"] = "jqw"
mapInstance["Age"] = 18
var people People
err := mapstructure.Decode(mapInstance, people)
if err != nil {
fmt.Println(err)
}
fmt.Println(people)
}
輸出
![](/d/20211017/f65215963cee93292cc57db3686137ac.gif)
(2)struct轉(zhuǎn)map例子
func StructToMapDemo(obj interface{}) map[string]interface{}{
obj1 := reflect.TypeOf(obj)
obj2 := reflect.ValueOf(obj)
var data = make(map[string]interface{})
for i := 0; i obj1.NumField(); i++ {
data[obj1.Field(i).Name] = obj2.Field(i).Interface()
}
return data
}
func TestStructToMap(){
student := Student{10, "jqw", 18}
data := StructToMapDemo(student)
fmt.Println(data)
}
輸出:
![](/d/20211017/ec0d53b36ae1d65faff67adab0e4816f.gif)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- golang struct, map, json之間的相互轉(zhuǎn)換