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}
- 1 回答
- 0 關注
- 160 瀏覽
添加回答
舉報