詳解Go語言中結構體與JSON間的轉換
前言
在日常開發(fā)中,我們往往會將 JSON
解析成對應的結構體,反之也會將結構體轉成 JSON
。接下來本文會通過 JSON
包的兩個函數(shù),來介紹 JSON
與結構體之間的轉換。
結構體轉 JSON
Marshal(v any) ([]byte, error)
:將 v
轉成 JSON
數(shù)據(jù),以 []byte
的形式返回。
import ( "encoding/json" "fmt" ) type User struct { Name string Age int Height float64 Weight *float64 Child bool marriageStatus string } func main() { weight := 120.5 user := User{ Name: "gopher", Age: 18, Height: 180.5, Weight: &weight, Child: false, marriageStatus: "未婚", } jsonBytes, err := json.Marshal(user) if err != nil { fmt.Println("error: ", err) return } fmt.Println(string(jsonBytes)) // {"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false} }
執(zhí)行結果:
{"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false}
根據(jù)結果可知:
- 不可導出字段(字段名以小寫字母開頭),是不能被轉成
JSON
的key
的,這也符合Go
的語法規(guī)定,以小寫字母開頭的變量或結構體字段等,不能在包外被訪問。 - 轉換后的字段名,與結構體字段的名字一樣。
- 如果字段是指針類型,轉換后的值為指針指向的字段值。
如果我們想要指定字段轉換之后的命名,或者將一個可導出的字段進行忽略,可以通過給結構體字段打上 JSON
標簽的方式實現(xiàn)。
import ( "encoding/json" "fmt" ) type User struct { Name string `json:"name"` Age int `json:"age"` Height float64 `json:"height"` Weight *float64 `json:"weight"` Child bool `json:"child"` MarriageStatus string `json:"-"` } func main() { weight := 120.5 user := User{ Name: "gopher", Age: 18, Height: 180.5, Weight: &weight, Child: false, MarriageStatus: "未婚", } jsonBytes, err := json.Marshal(user) if err != nil { fmt.Println("error: ", err) return } fmt.Println(string(jsonBytes)) // {"name":"gopher","age":18,"height":180.5,"weight":120.5,"child":false} }
通過給結構體字段定打上 JSON
標簽,可指定轉成 JSON
后的字段名,如果 JSON
標簽的值為 -
,則在轉換 JSON
時忽略此字段。
JSON 解析結構體
Unmarshal(data []byte, v any) error
:將 JSON
解析成指定的結構體。
import ( "encoding/json" "fmt" ) type User struct { Name string `json:"name"` Age int `json:"age"` Height float64 `json:"height"` Child bool `json:"-"` marriageStatus string } func main() { userStr := ` { "name": "gopher", "age": 18, "height": 180.5, "child": true, "marriageStatus": "未婚" } ` user := &User{} err := json.Unmarshal([]byte(userStr), &user) if err != nil { fmt.Println("error: ", err) return } fmt.Printf("%#v", user) // &main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""} }
執(zhí)行結果:
&main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""}
根據(jù)結果可知:
使用Unmarshal
函數(shù)時,我們需要傳入結構體的指針類型,否則結構體字段的值將不會被改變,因為底層是通過指針去修改結構體字段的值。
JSON
解析時,JSON
的 key
與結構體字段的匹配規(guī)則是:
- 優(yōu)先查找
JSON
標簽值和key
一樣的,找到則將value
賦值給對應字段。 - 如果沒有
JSON
標簽值與key
相匹配,則根據(jù)字段名進行匹配。
可以發(fā)現(xiàn),如果結構體字段是非導出字段或 JSON
標簽的值為 -
,將不會被匹配到。
小結
本文介紹了 Go
語言里,JSON
與結構體之間的轉換。在結構體轉 JSON
時,我們可以通過給字段打標簽,指定轉換后的 key
命名,需要注意的是,如果結構體的字段為非導出字段或字段的 JSON
標簽值為 -
,在轉換 JSON
時,將會被忽略。反之 JSON
解析結構體時也是一樣的。
到此這篇關于詳解Go語言中結構體與JSON間的轉換的文章就介紹到這了,更多相關Go語言結構體 JSON內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
go語言通過odbc操作Access數(shù)據(jù)庫的方法
這篇文章主要介紹了go語言通過odbc操作Access數(shù)據(jù)庫的方法,實例分析了Go語言通過odbc連接、查詢與關閉access數(shù)據(jù)庫的技巧,需要的朋友可以參考下2015-03-03用gin開發(fā)的golang項目三種開發(fā)模式方式
這篇文章主要介紹了用gin開發(fā)的golang項目三種開發(fā)模式方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01