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

标签 json go reflection types

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

相关文章:

c# - 空对象不能转换为值类型

amazon-web-services - Docker - 无法从外部访问 docker 端口

通过 Go 应用程序调用的 IIS appcmd - 无效的 XML 输入

go - 为什么函数能够返回局部变量?

java - 在 Java 中,如何从组件类型的类中获取类的数组?

android - 从 json 模板在 Android 中创建动态 UI

java - 有没有办法向下转型 GWT AutoBean?

javascript - 在 AngularJS 中访问多维字典

c# - 如何从 StackTrace 获取参数值

.net - 是否有更快的方法使用反射访问类的属性成员?