Golang中map转结构体的不同方法

使用第三方模块mapstructure

go get github.com/mitchellh/mapstructure

~~~

带下划线的字段需要特殊处理一下❗️❗️❗️

// 对于带 下划线命名 的变量,需要特殊方法解析
type CurrUser struct {
    Name        string   `json:"name"`
    PhoneNumber string   `json:"phone_number"`
    Hobbies     []string `json:"hobbies"`
    ABC         string   `json:"a_b_c"`
}

func TestRangeMap3(t *testing.T) {

    m1 := map[string]interface{}{
        "name":         "whw",
        "phone_number": "13333333333", // TODO 将字段设置为 phonenumber 就可以解析了!!!
        "hobbies":      []string{"football", "basketball"},
        "a_b_c":        "whw666",
    }
    u1 := CurrUser{}

    dec, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
        TagName: "json",
        Result:  &u1,
    })
    if err != nil {
        panic(err)
    }

    // dec.Decode方法...
    err = dec.Decode(m1)
    if err != nil {
        panic(err)
    }

    fmt.Println("name>>> ", u1.Name)                // whw
    fmt.Println("phone_number>>> ", u1.PhoneNumber) // 13333333333
    fmt.Println("hobbies>>> ", u1.Hobbies)          // [football basketball]
    fmt.Println("a_b_c>>> ", u1.ABC)                // whw666
}

~~~

带下划线的字段普通方法解不出来

package scripts_stroage

import (
    "encoding/json"
    "fmt"
    "github.com/mitchellh/mapstructure"
    "testing"
)

type User struct {
    Name        string   `json:"name"`
    PhoneNumber string   `json:"phone_number"`
    Hobbies     []string `json:"hobbies"`
}

// 对于带 下划线命名 的变量,不能直接解析到
func TestRangeMap1(t *testing.T) {

    m1 := map[string]interface{}{
        "name":         "whw",
        "phone_number": "13333333333", // TODO 将字段设置为 phonenumber 就可以解析了!!!
        "hobbies":      []string{"football", "basketball"},
    }
    u1 := User{}
    // mapstructure.Decode方法...没有办法解析带下划线的字段~
    err := mapstructure.Decode(m1, &u1)
    if err != nil {
        panic(err)
    }

    fmt.Println("name>>> ", u1.Name)                // whw
    fmt.Println("phone_number>>> ", u1.PhoneNumber) // (空,没有解析到)
    fmt.Println("hobbies>>> ", u1.Hobbies)          // [football basketball]
}

// 对于带 下划线命名 的变量,需要json序列化与反序列化操作
func TestMap2Struct2(t *testing.T) {

    m2 := map[string]interface{}{
        "name":         "whw2",
        "phone_number": "13333333333",
        "hobbies":      []string{"football", "basketball"},
    }
    u2 := User{}
    // 序列化
    arr, err := json.Marshal(m2)
    if err != nil {
        panic(err)
    }
    // 反序列化
    err2 := json.Unmarshal(arr, &u2)
    if err2 != nil {
        panic(err2)
    }

    fmt.Println("name>>> ", u2.Name)                // whw2
    fmt.Println("phone_number>>> ", u2.PhoneNumber) // 13333333333
    fmt.Println("hobbies>>> ", u2.Hobbies)          // [football basketball]

}

外链

https://blog.csdn.net/qq_34326321/article/details/105123996

https://pkg.go.dev/github.com/mitchellh/mapstructure#section-readme

posted on 2021-09-06 15:23  江湖乄夜雨  阅读(1462)  评论(0编辑  收藏  举报