对未知属性名的结构进行嵌套属性?

问题描述 投票:9回答:1

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

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

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

    var data Frame

在unmarshal之后,我可以通过以下方式访问类型。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个回答
15
投票

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"`
}

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

© www.soinside.com 2019 - 2024. All rights reserved.