gpt4 book ai didi

json - UnmarshalJSON 来自 []interface{} 的任何类型可能吗?

转载 作者:IT王子 更新时间:2023-10-29 01:58:17 27 4
gpt4 key购买 nike

当您将 JSON 解码为 []interface{} 时,除了 bool、int 和 string 等标准类型之外,还有什么方法可以自动检测类型吗?

我注意到以下内容,假设我编码 [uuid.UUID, bool]然后我得到的 JSON 看起来像:

[[234,50,7,116,194,41,64,225,177,151,60,195,60,45,123,106],true]

当我再次解码时,我得到了通过 reflect 显示的类型:

[]接口(interface){}, bool

我不明白它为什么选择 []interface{}。如果它无法检测到它,难道不应该至少是 interface{} 吗?

无论如何,我的问题是,当目标是 []interface{} 类型时,是否可以解码任何类型?它似乎适用于 string、bool、int 等标准类型,但对于自定义类型我认为这是不可能的,是吗?您可以定义自定义 JSON 编码/解码方法,但这仅在您将其解码为目标类型时才有效,以便它可以查找要使用的自定义编码/解码方法。

最佳答案

您可以将任何类型解码为 interface{} 类型的值。如果您使用 []interface{} 类型的值,您只能将 JSON 数组解码到其中,但是,数组的元素可以是任何类型。

由于您使用的是 interface{}[]interface{},是的,类型信息不可用,这取决于 encoding/json包来选择它认为最合适的。例如,对于 JSON 对象,它将选择 map[string]interface{}。默认类型的完整列表记录在 json.Unmarshal() 中:

To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value:

bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null

显然,如果您的 JSON 编码/解码逻辑需要一些预处理/后处理,json 包不会奇迹般地发现它。只有当您解码为特定类型的值(实现 json.Unmarshaler )时,它才能知道这些。 json 包仍然能够将它们解码为默认类型,但自定义逻辑显然不会在它们上运行。

关于json - UnmarshalJSON 来自 []interface{} 的任何类型可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41890150/

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