解组到接口{}中,然后执行类型声明

解组到接口{}中,然后执行类型声明,第1张

解组到接口{}中,然后执行类型声明

功能文档

json
中显示了包解组到的默认类型
Unmarshal

bool, for JSON booleansfloat64, for JSON numbersstring, for JSON strings[]interface{}, for JSON arraysmap[string]interface{}, for JSON objectsnil for JSON null

由于您要编组为

interface{}
,因此返回的类型将仅来自该集合。该
json
软件包不了解
Something1
Something2
。您需要从将
map[string]interface{}
json对象解组为的转换,或者直接解组为所需的struct类型。

如果您不想从通用接口中解压缩数据,或者以某种方式标记数据以便知道期望的类型,则可以迭代地获取json并尝试将其解编为所需的每种类型。

您甚至可以将它们打包到包装结构中,为您进行拆封:

type Something1 struct {    Thing      string `json:"thing"`    OtherThing int64  `json:"other_thing"`}type Something2 struct {    Croc  int  `json:"croc"`    Odile bool `json:"odile"`}type Unpacker struct {    Data       interface{}}func (u *Unpacker) UnmarshalJSON(b []byte) error {    smth1 := &Something1{}    err := json.Unmarshal(b, smth1)    // no error, but we also need to make sure we unmarshaled something    if err == nil && smth1.Thing != "" {        u.Data = smth1        return nil    }    // abort if we have an error other than the wrong type    if _, ok := err.(*json.UnmarshalTypeError); err != nil && !ok {        return err    }    smth2 := &Something2{}    err = json.Unmarshal(b, smth2)    if err != nil {        return err    }    u.Data = smth2    return nil}

http://play.golang.org/p/Trwd6IShDW



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5012989.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存