【问题标题】:UnmarshalJSON any type from []interface{} possible?UnmarshalJSON 来自 []interface{} 的任何类型都可能吗?
【发布时间】:2017-06-12 21:49:33
【问题描述】:

当您将 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 编组/解组方法,但这仅在您将其解码为目标类型时才有效,以便它可以查找要使用的自定义编组/解组方法。

【问题讨论】:

    标签: json go reflection types


    【解决方案1】:

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

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

    为了将 JSON 解组为接口值,Unmarshal 将其中一项存储在接口值中:

    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 包仍然能够将它们解组为默认类型,但自定义逻辑显然不会在它们上运行。

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2017-10-22
      • 2023-03-09
      • 1970-01-01
      • 2020-12-01
      • 2013-11-11
      相关资源
      最近更新 更多