猿问

根据golang中的条件执行自解组方法或默认解组方法

我是golang的新手。我有一个结构Item。


type Item Struct{

   ...

}

我知道它有一个默认的UnmarshalJSON方法。

现在我想将数据解组到它。


对于数据可能有两种不同的格式。所以我的期望如下:


if condition {

    //execute default UnmarshalJSON

    json.Unmarshal(data, &item) 

}else{

    //execute my own UnmarshalJSON

    json.Unmarshal(data, &item) 

}

这是我自己的 UnmarshalJSON。


func (item *Item) UnmarshalJSON(data []byte) error{

   ...

}

也许我自己 UnmarshalJSON 会覆盖默认值,所以这两个方法不能同时存在。我想知道如何解决这种将两种不同格式的数据解组到一个结构中的问题。


慕森王
浏览 76回答 1
1回答

慕桂英4014372

使用一个接口,无论您从 json 响应中获取的格式是什么,并将响应解组到接口中:func main(){    var result interface{}    if err := json.Unmarshal(jsonbytes, &result); err != nil{         fmt.Println(err)    }}然后使用类型断言获取接口下的值。但我认为在你的情况下,如果你没有密钥的基础类型。更好的方法是使用递归来获取值。func fetchValue(value interface{}) {    switch value.(type) {    case string:        fmt.Printf("%v is an interface \n ", value)    case bool:        fmt.Printf("%v is bool \n ", value)    case float64:        fmt.Printf("%v is float64 \n ", value)    case []interface{}:        fmt.Printf("%v is a slice of interface \n ", value)        for _, v := range value.([]interface{}) { // use type assertion to loop over []interface{}            fetchValue(v)        }    case map[string]interface{}:        fmt.Printf("%v is a map \n ", value)        for _, v := range value.(map[string]interface{}) { // use type assertion to loop over map[string]interface{}            fetchValue(v)        }    default:        fmt.Printf("%v is unknown \n ", value)    }}Go 操场上的工作代码上面的代码可以让你获取解析到接口中的任何类型的值。笔记:在 golang 中定义了当您将未知的 json 解组到接口中时。它将转换为以下类型:bool, for JSON booleansfloat64, for JSON numbersstring, for JSON strings[]interface{}, for JSON arrays // slice of interface{}map[string]interface{}, for JSON objectsnil for JSON null
随时随地看视频慕课网APP

相关分类

Go
我要回答