使用不同的键解组相同的 json 对象以进行切片结构

我不知道如何在不重写整个解析器的情况下使用不同的键将相同的 JSON 对象序列化为 Go 切片结构。例如,我可以收到的 JSON,它可能包含具有不同密钥的 N 个对象(localhost1/localhost2/localhost3 等)。在这个例子中,我有一个键 localhost1/localhost2/localhost3,每个键只有一个字段就可以了。


{

"stats": {

        "localhost1": {

            "ok": 1

        },

        "localhost2": {

            "ok": 1

        },

        "localhost3": {

            "ok": 1

        }

     }

}

我可以使用以下结构映射来解压缩整个 JSON。


type HostStatus struct {

        Ok int `json:"ok"`

}


type Test struct {

    Stats struct {

        Localhost1 HostStatus `json:"localhost1"`

        Localhost2 HostStatus `json:"localhost2"`

        Localhost3 HostStatus `json:"localhost3"`

    }  `json:"stats"`

}

整个示例。


package main


import (

    "encoding/json"

    "fmt"

)

type HostStatus struct {

        Ok int `json:"ok"`

}


type Test struct {

    Stats struct {

        Localhost1 HostStatus `json:"localhost1"`

        Localhost2 HostStatus `json:"localhost2"`

        Localhost3 HostStatus `json:"localhost3"`

    }  `json:"stats"`

}



func main() {

    var resp = []byte(`{

        "stats": {

            "localhost1": {

            "ok": 1

        },

        "localhost2": {

            "ok": 1

        },

        "localhost3": {

            "ok": 1

        }

        }

    }`)


    var r Test

    er := json.Unmarshal(resp, &r)

    if er != nil {

        panic(er)

    } else {

        fmt.Println(r)

    }

}

该解决方案的主要问题是,它需要在每个 HostStatus 的 Stats 结构中进行硬编码,通过 json:xxx 标记将 1:1 映射到 JSON 输出。但我想找到一种方法将所有这些对象映射到 HostStatus 切片/数组,因为我不知道我可能会收到多少个 HostStatus 对象以及每个对象的键是什么。


慕后森
浏览 88回答 1
1回答

Qyouu

尝试这个:type Test struct {     Stats map[string]HostStatus `json:"stats"`     }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go