在 JSON 和 Golang 中表示不同类型的事物列表

我试图用 JSON 表示一些数据,其中有一个事物列表,其中每个事物都有一些共同的特征(例如名称),另一个字段的值可以是字符串或整数。例如:


{

    "items": [

        {

            "name": "thing1",

            "type": "string",

            "value": "foo"

        },

        {

            "name": "thing2",

            "type": "int",

            "value": 42

        }

    ]

}

该 JSON 对我来说看起来很合理,但事实证明,尝试创建一个数据结构以在 Golang 中将其反序列化(解组)为困难。我想我可以用类多态性在 Java 中做到这一点,但在 Go 中我觉得被困住了。我已经尝试了很多东西,但还没有得到它。最终,它归结为缺乏结构类型多态性。


在 Go 中,我可以有一个接口切片(列表),但据我所知,我需要不同类型的实际结构。


关于如何在 Golang 中表示它并能够解组的任何建议?


或者,我应该以不同的方式构建 JSON 本身吗?


慕尼黑8549860
浏览 96回答 3
3回答

芜湖不芜

此数据结构正确地表示您的 JSON:type Data struct {    Items []struct {        Name string `json:"name"`        Type string `json:"type"`        Value interface{} `json:"value"`    } `json:"items"`}然后,您可以使用json.Unmarshal. 如果你使用 Go 1.18,你可以any使用interface{}.此外,在 Go 中你甚至不需要类型字段。您可以使用类型断言来确定值类型。

九州编程

您可以创建这样的结构type items struct {    name   string    type_1 string    value  interface{}}接口可以容纳任何数据类型,因为类型是保留关键字,我使用了 type_1

三国纷争

你可以在 Go 1.18 中这样做:type Data struct {    Items []struct {        Name string `json:"name"`        Type string `json:"type"`        Value any `json:"value"`    } `json:"items"`}func main() {    data := Data{}    // it's your json bytes    bytesData := []byte()    if err := json.Unmarshal(byteData, &data); err != nil {        log.Fatal(err)    }}// use data here PS 如果您使用的是旧版本,请使用interface{}而不是any.
打开App,查看更多内容
随时随地看视频慕课网APP