文中所有代碼,可以在下邊鏈接頁面運行驗證。
https://play.golang.org/
1.json轉struct
package main
import (
"encoding/json"
"fmt"
)
// 結構體字段首字母必須要大寫,否則外部無法訪問,json轉struct也轉不成功
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
testJson2Struct()
}
func testJson2Struct() {
jsonStr := `
{
"name":"xuxiaobai",
"age":13
}
`
var person Person
json.Unmarshal([]byte(jsonStr), &person)
fmt.Println("person:", person)
}
輸出結果
person: {xuxiaobai 13}
2.struct 轉 json
package main
import (
"encoding/json"
"fmt"
)
// 結構體字段首字母必須要大寫,否則外部無法訪問,json轉struct也轉不成功
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
testStruct2Json()
}
func testStruct2Json() {
p := Person{
Name: "xuxiaobai",
Age: 18,
}
fmt.Println("p:", p)
// Person結構體轉化爲對應的json
jsonBytes, err := json.Marshal(p)
if err != nil {
fmt.Println("Person序列化失敗")
return
}
fmt.Println("json串:", string(jsonBytes))
}
輸出結果
p: {xuxiaobai 18}
json串: {"name":"xuxiaobai","age":18}
3.json轉map
package main
import (
"encoding/json"
"fmt"
)
func main() {
testJson2Map()
}
func testJson2Map() {
jsonStr := `{
"name":"xuxiaobai",
"age":18
}`
// 定義map
var mapRes map[string]interface{}
// json轉map
if err := json.Unmarshal([]byte(jsonStr), &mapRes); err != nil {
fmt.Println("json轉map失敗")
return
}
fmt.Println("mapRes:", mapRes)
}
輸出結果
mapRes: map[age:18 name:xuxiaobai]
4.map轉json
package main
import (
"encoding/json"
"fmt"
)
func main() {
testMap2Json()
}
func testMap2Json() {
testMap := make(map[string]interface{})
testMap["name"] = "xuxiaobai"
testMap["age"] = 18
testMap["address"] = "北京"
jsonBytes, err := json.Marshal(testMap)
if err != nil {
fmt.Println("map轉json失敗")
}
fmt.Println("testMap轉換成的json串:", string(jsonBytes))
}
輸出結果
testMap轉換成的json串: {"address":"北京","age":18,"name":"xuxiaobai"}
5.Map轉struct
轉換用到的方法:
“github.com/gogf/gf/util/gconv”
比mapstructure要好用,mapstructure有些字段轉換會失敗。
func Struct(params interface{}, pointer interface{}, mapping ...map[string]string) error
func StructDeep(params interface{}, pointer interface{}, mapping ...map[string]string) error
參數介紹:
- params爲需要轉換到struct的變量參數,可以爲任意數據類型,常見的數據類型爲map;
- pointer爲需要執行轉的目標struct對象,這個參數必須爲該struct的對象指針,轉換成功後該對象的屬性將會更新;
- mapping爲自定義的map鍵名到strcut屬性之間的映射關係,此時params參數必須爲map類型,否則該參數無意義;
- StructDeep相比較於Struct方法,區別是支持遞歸轉換,即會同時遞歸轉換其屬性中的結構體對象,特別用於轉換帶有繼承結構的自定義struct;
package main
import (
"fmt"
"github.com/gogf/gf/util/gconv"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Address string `json:"address"`
}
func main() {
testMap2Struct()
}
func testMap2Struct() {
testMap := make(map[string]interface{})
testMap["name"] = "xuxiaobai"
testMap["age"] = 18
testMap["address"] = "北京"
var person Person
// map轉struct
if err := gconv.Struct(testMap, &person); err != nil {
fmt.Println("map轉struct失敗")
return
}
fmt.Println("map轉換struct結果:", person)
}
輸出結果
map轉換struct結果: {xuxiaobai 18 北京}
參考:struct轉換
6.struct轉map
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Address string `json:"address"`
}
func main() {
p := Person{"zhangsan", 20, "上海"}
pMap := testStruct2Map(p)
fmt.Println("struct轉map結果:", pMap)
}
func testStruct2Map(obj interface{}) map[string]interface{} {
t := reflect.TypeOf(obj)
v := reflect.ValueOf(obj)
var data = make(map[string]interface{})
for i := 0; i < t.NumField(); i++ {
data[t.Field(i).Name] = v.Field(i).Interface()
}
return data
}
輸出結果
struct轉map結果: map[Address:上海 Age:20 Name:zhangsan]