亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mapstructure 如何使用鑒別器來解碼具體類型

mapstructure 如何使用鑒別器來解碼具體類型

Go
飲歌長嘯 2023-06-01 15:05:08
文檔 ( https://github.com/mitchellh/mapstructure ) 提到了 mapstructure 解碼的好處{  "type": "person",  "name": "Mitchell"}我正在尋找一個顯示解碼過程的示例,例如解組 aPerson或Petclass
查看完整描述

1 回答

?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

該庫僅將地圖映射到結構。它不進行特定于類型的解碼。引用其文檔:

如果不首先從 JSON 中讀取“類型”字段,我們可能無法填充特定結構。我們總是可以對 JSON 進行兩次解碼(首先讀取“類型”,然后再讀取其余部分)。然而,將它解碼成一個結構要簡單得多map[string]interface{},讀取“type”鍵,然后使用類似這個庫的東西將它解碼成正確的結構。

它所提供的只是您只需將 JSON 源解析一次,然后將其解析為映射,然后您可以自己決定需要映射或解組為哪種類型。然后你就可以使用已經構建好的地圖來填充你需要的類型。

看這個例子:

type Person struct {

    Name string `json:"name"`

}


type Credentials struct {

    User     string `json:"user"`

    Password string `json:"password"`

}


func main() {

    for _, src := range []string{srcPerson, srcCredentials} {

        var m map[string]interface{}

        if err := json.Unmarshal([]byte(src), &m); err != nil {

            panic(err)

        }


        switch m["type"] {

        case "person":

            var p Person

            if err := mapstructure.Decode(m, &p); err != nil {

                panic(err)

            }

            fmt.Printf("%T %+v\n", p, p)

        case "credentials":

            var c Credentials

            if err := mapstructure.Decode(m, &c); err != nil {

                panic(err)

            }

            fmt.Printf("%T %+v\n", c, c)

        }

    }

}


const srcPerson = `{

  "type": "person",

  "name": "Mitchell"

}`


const srcCredentials = `{

  "type": "credentials",

  "user": "bob",

  "password": "secret"

}`

輸出:


main.Person {Name:Mitchell}

main.Credentials {User:bob Password:secret}


查看完整回答
反對 回復 2023-06-01
  • 1 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號