[go-每日一库] golang中借助json等库实现struct和map互转

1.struct -> map

1.1 version-1

指定struct中tag-map

// version-1, struct -> map
type User struct {
	Name string `map:"name,omitempty"`
	Age int `map:"age,omitempty"`
	Profile UserProfile `map:"profile,dive"` // struct dive
	NoDive StructDive `map:"no_dive, omitempty"` // no dive
}

type UserProfile struct {
	Address string `map:"address"`
	City string `map:"city"`
	Job string `map:"job"`
}

type StructDive struct {
	NoDive int
}

func newUser() User {
	name := "spiderMan"
	age := 12
	profile := UserProfile{
		Address: "Jiaozi Road",
		City: "chengdu",
		Job: "Backend Engineer",
	}
	nodive := StructDive{20}
	return User{
		Name: name,
		Age: age,
		Profile: profile,
		NoDive: nodive,
	}
}

func struct2map(v interface{}) map[string]interface{} {
	data, _ := json.Marshal(v)
	m := make(map[string]interface{})
	_ = json.Unmarshal(data, &m)
	return m
}

1.2 version-2

不指定struct直接转map

// version-2 struct -> map
type User2 struct {
	Name string `json:"name"`
	Profile UserProfile `json:"profile"`
}

type UserProfile2 struct {
	Address string `json:"address"`
	City string `json:"city"`
	Job string `json:"job"`
}

func newUser2() User2 {
	return User2{
		Name: "superMan",
		Profile: UserProfile{
			Address: "Tiananmen",
			City: "beijing",
			Job: "HR",
		},
	}
}

2.map -> struct

func newMap() map[string]interface{} {
	m := make(map[string]interface{})
	m["name"] = "super-man"
	m["profile"] = map[string]interface{}{
		"address": "Tiananmen",
		"city": "beijing",
		"job": "HR",
	}
	return m
}

// map -> struct, dst should be ptr
func map2Struct(m map[string]interface{}, dst interface{})  {
	data, err := json.Marshal(m)
	if err != nil {
		fmt.Println(err)
	}
	_ = json.Unmarshal(data, &dst)
}

以下是测试情况:

func main()  {
	// 1.struct -> map
	// version-1
	user := newUser()
	m := struct2map(user)
	for k,v := range m {
		fmt.Printf("key: %s, val: %v\n", k, v)
		switch reflect.TypeOf(v).Kind() {
		case reflect.Map:
			for k2, v2 := range v.(map[string]interface{}) {
				fmt.Printf("key-2: %s, val-2: %v\n", k2, v2)
			}
		}
	}
	/*
	key: Age, val: 12
	key: Profile, val: map[Address:Jiaozi Road City:chengdu Job:Backend Engineer]
	key-2: Address, val-2: Jiaozi Road
	key-2: City, val-2: chengdu
	key-2: Job, val-2: Backend Engineer
	key: NoDive, val: map[NoDive:20]
	key-2: NoDive, val-2: 20
	key: Name, val: spiderMan
	 */

	// version-2
	fmt.Println("\nit's version-2 struct to map")
	user2 := newUser2()
	m2 := struct2map(user2)
	for k,v := range m2 {
		fmt.Printf("key: %s, val: %v\n", k, v)
		switch reflect.TypeOf(v).Kind() {
		case reflect.Map:
			for k2, v2 := range v.(map[string]interface{}) {
				fmt.Printf("key-2: %s, val-2: %v\n", k2, v2)
			}
		}
	}
	/*
	key: name, val: superMan
	key: profile, val: map[Address:Tiananmen City:beijing Job:HR]
	key-2: Job, val-2: HR
	key-2: Address, val-2: Tiananmen
	key-2: City, val-2: beijing
	 */

	// 2.map -> struct
	fmt.Println("\nmap -> json")
	m3 := newMap()
	var user3 User2
	map2Struct(m3, &user3)
	fmt.Println(user3)
	/*
	{super-man {Tiananmen beijing HR}}
	 */
}

posted on 2022-06-24 15:33  进击的davis  阅读(121)  评论(0编辑  收藏  举报

导航