【问题标题】:Nested properties for structs with unknown property names?具有未知属性名称的结构的嵌套属性?
【发布时间】:2012-03-21 08:54:49
【问题描述】:

我正在使用 JSON 将一些值从外部源获取到变量中。

我有一个像这样的类型,json.Unmarshal 将值放入:

    type Frame struct {
        Type  string
        Value map[string]interface{}
    }

    var data Frame

解组后,我可以通过以下方式访问类型:data.Type

但如果我尝试做类似的事情:

    if data.Type == "image" {
        fmt.Printf("%s\n", data.Value.Imagedata)
    }

编译器抱怨没有这样的值data.Value.Imagedata

所以我的问题是,我如何在 Go 中引用我知道根据某些条件会存在的属性?

这样做很有效:

    type Image struct {
        Filename string
    }

    type Frame struct {
        Type  string
        Value map[string]interface{}
    }

但这不是很灵活,因为我会收到不同的Values。

【问题讨论】:

    标签: go


    【解决方案1】:

    json.Unmarshal 将尽最大努力将数据放置在最符合您的类型的位置。从技术上讲,您的第一个示例将起作用,但您尝试使用点符号访问 Value 字段,即使您声明它是一个地图:

    这应该会给你某种形式的输出:

    if data.Type == 'image'{
        fmt.Printf("%v\n", data.Value["Imagedata"])
    }
    

    ...考虑到“Imagedata”是 JSON 中的一个键。

    您可以选择根据需要或期望的结构深度定义类型,或者使用interface{},然后对值进行类型断言。由于Value 字段是一个映射,您将始终访问像Value[key] 这样的键,并且该映射条目的值是一个interface{},您可以键入像Value[key].(float64) 这样的断言。

    至于做更明确的结构,我发现你可以将对象分解成它们自己的类型,或者将它定义为嵌套在一个地方:

    嵌套(带有匿名结构)

    type Frame struct {
        Type  string
        Value struct {
            Imagedata string `json:"image_data"`
        }
    }
    

    单独的结构

    type Frame struct {
        Type    string
        Value   value 
    }
    
    type value struct {
        Imagedata string `json:"image_data"`
    }
    

    我自己还在学习 Go,所以这是我目前理解的程度:-)。

    【讨论】:

    • 啊!伙计,这很简单。感谢您的解释。真的很感激!
    • 我很少看到这里有一个围棋问题,我可以在围棋天才找到它之前设法回答。
    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多