1 回答

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
要解組為一組類(lèi)型,它們都實(shí)現(xiàn)一個(gè)公共接口,您可以json.Unmarshaler
在父類(lèi)型上實(shí)現(xiàn)接口,map[string]CustomInterface
在您的情況下:
type CustomInterfaceMap map[string]CustomInterface
func (m CustomInterfaceMap) UnmarshalJSON(b []byte) error {
? ? data := make(map[string]json.RawMessage)
? ? if err := json.Unmarshal(b, &data); err != nil {
? ? ? ? return err
? ? }
? ? for k, v := range data {
? ? ? ? var dst CustomInterface
? ? ? ? // populate dst with an instance of the actual type you want to unmarshal into
? ? ? ? if _, err := strconv.Atoi(string(v)); err == nil {
? ? ? ? ? ? dst = &CustomImplementationInt{} // notice the dereference
? ? ? ? } else {
? ? ? ? ? ? dst = &CustomImplementationFloat{}
? ? ? ? }
? ? ? ? if err := json.Unmarshal(v, dst); err != nil {
? ? ? ? ? ? return err
? ? ? ? }
? ? ? ? m[k] = dst
? ? }
? ? return nil
}
確保您解組為CustomInterfaceMap
,而不是map[string]CustomInterface
,否則自定義UnmarshalJSON
方法將不會(huì)被調(diào)用。
json.RawMessage
是一種有用的類(lèi)型,它只是一個(gè)原始編碼的 JSON 值,這意味著它是一個(gè)簡(jiǎn)單的[]byte
JSON 以未解析的形式存儲(chǔ)在其中。
- 1 回答
- 0 關(guān)注
- 150 瀏覽
添加回答
舉報(bào)