gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:21:34 26 4
gpt4 key购买 nike

我是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 会覆盖默认值,所以这两个方法不能同时存在。我想知道如何解决这种将两种不同格式的数据解码到一个结构中的问题。

最佳答案

无论您从 json 响应中获取的格式是什么,都使用一个接口(interface)并将响应解码到接口(interface)中:

func main(){
var result interface{}
if err := json.Unmarshal(jsonbytes, &result); err != nil{
fmt.Println(err)
}
}

然后使用类型断言获取接口(interface)下的值。但我认为在你的情况下,如果你没有 key 的基础类型。更好的方法是使用递归来获取值。

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 playground 的工作代码

上面的代码可以让你获取解析到接口(interface)中的任何类型的值。

注意:

In golang it is defined that when you unmarshal unknown json into an interface. It will be converted into following types:

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

关于json - 根据golang中的条件执行自解码方法或默认解码方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52945508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com