为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕森王 2023-04-24 16:57:53
我是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 会覆盖默认值,所以这两个方法不能同时存在。我想知道如何解决这种将两种不同格式的数据解组到一个结构中的问题。
查看完整描述

1 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

使用一个接口,无论您从 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 booleans

float64, for JSON numbers

string, for JSON strings

[]interface{}, for JSON arrays // slice of interface{}

map[string]interface{}, for JSON objects

nil for JSON null


查看完整回答
反对 回复 2023-04-24
  • 1 回答
  • 0 关注
  • 60 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信