当您将 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/