go json、struct、map之間轉換

文中所有代碼,可以在下邊鏈接頁面運行驗證。
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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章