一尘不染

具有未知属性名称的结构的嵌套属性?

go

我正在使用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{}
    }

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


阅读 233

收藏
2020-07-02

共1个答案

一尘不染

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

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

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

…考虑到“ Imagedata”是JSON中的关键。

您可以选择根据需要或期望的结构深度定义类型,或者使用an
interface{}然后对值进行类型声明。如果该Value字段是一个映射,则您将始终访问键,如Value[key],而该映射项的值就是interface{}您可以键入assert的值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自己,所以这是我目前的理解程度:-)。

2020-07-02