golang 實(shí)現(xiàn)struct、json、map互相轉(zhuǎn)化
一、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()
}
輸出:

注意json里面的key和struct里面的key要一致,struct中的key的首字母必須大寫(xiě),而json中大小寫(xiě)都可以。
(2)struct轉(zhuǎn)json
在結(jié)構(gòu)體中引入tag標(biāo)簽,這樣匹配的時(shí)候json串對(duì)應(yīng)的字段名需要與tag標(biāo)簽中定義的字段名匹配,當(dāng)然tag中定義的名稱(chēng)不需要首字母大寫(xiě),且對(duì)應(yīng)的json串中字段名仍然大小寫(xiě)不敏感。此時(shí),結(jié)構(gòu)體中對(duì)應(yīng)的字段名可以不用和匹配的一致,但是首字母必須大寫(xiě),只有大寫(xiě)才是可對(duì)外提供訪問(wèn)的。
例子:
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()
}
輸出:

二、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)
}
輸出:

(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))
}
輸出:

例2:
func MapToJsonDemo2(){
b, _ := json.Marshal(map[string]int{"test":1, "try":2})
fmt.Println(string(b))
}
輸出:

三、map和struct互轉(zhuǎn)
(1)map轉(zhuǎn)struct
需要安裝一個(gè)第三方庫(kù)
在命令行中運(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)
}
輸出

(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)
}
輸出:

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Go項(xiàng)目中添加生成時(shí)間與版本信息的方法
本文主要介紹了Go項(xiàng)目中添加生成時(shí)間與版本信息的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Go語(yǔ)言sync.Map詳解及使用場(chǎng)景
Go語(yǔ)言中的sync.Map是一個(gè)高效的并發(fā)安全映射結(jié)構(gòu),適用于高并發(fā)讀多寫(xiě)少的場(chǎng)景,它通過(guò)讀寫(xiě)分離、無(wú)鎖讀取路徑、寫(xiě)入時(shí)的鎖保護(hù)等機(jī)制,提高了讀取性能并減少了鎖競(jìng)爭(zhēng),sync.Map不需要手動(dòng)管理鎖,降低了編程復(fù)雜性,適合需要簡(jiǎn)單并發(fā)訪問(wèn)的場(chǎng)合2024-10-10
GoLang基于zap日志庫(kù)的封裝過(guò)程詳解
Zap是我個(gè)人比較喜歡的日志庫(kù),是uber開(kāi)源的,有較好的性能,在項(xiàng)目開(kāi)發(fā)中,經(jīng)常需要把程序運(yùn)行過(guò)程中各種信息記錄下來(lái),有了詳細(xì)的日志有助于問(wèn)題排查和功能優(yōu)化,這篇文章主要介紹了GoLang基于zap日志庫(kù)的封裝過(guò)程,想要詳細(xì)了解可以參考下文2023-05-05
Go項(xiàng)目開(kāi)發(fā)中如何讀取應(yīng)用配置詳解
本文主要介紹了Go項(xiàng)目開(kāi)發(fā)中如何讀取應(yīng)用配置詳解,Go生態(tài)中有很多包可以加載并解析配置,最受歡迎的是Viper包,下面就來(lái)詳細(xì)的介紹一下2024-05-05
golang 將[]byte轉(zhuǎn)成16進(jìn)制的實(shí)現(xiàn)
這篇文章主要介紹了golang 將[]byte轉(zhuǎn)成16進(jìn)制的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

