1 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
該庫(kù)僅將地圖映射到結(jié)構(gòu)。它不進(jìn)行特定于類型的解碼。引用其文檔:
如果不首先從 JSON 中讀取“類型”字段,我們可能無法填充特定結(jié)構(gòu)。我們總是可以對(duì) JSON 進(jìn)行兩次解碼(首先讀取“類型”,然后再讀取其余部分)。然而,將它解碼成一個(gè)結(jié)構(gòu)要簡(jiǎn)單得多
map[string]interface{}
,讀取“type”鍵,然后使用類似這個(gè)庫(kù)的東西將它解碼成正確的結(jié)構(gòu)。
它所提供的只是您只需將 JSON 源解析一次,然后將其解析為映射,然后您可以自己決定需要映射或解組為哪種類型。然后你就可以使用已經(jīng)構(gòu)建好的地圖來填充你需要的類型。
看這個(gè)例子:
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}
- 1 回答
- 0 關(guān)注
- 169 瀏覽
添加回答
舉報(bào)