使用不同的键解组同一json对象以切片struct

时间:2019-09-02 21:19:38

标签: json go

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

{
"stats": {
        "localhost1": {
            "ok": 1
        },
        "localhost2": {
            "ok": 1
        },
        "localhost3": {
            "ok": 1
        }
     }
}

我可以使用以下Structs映射来取消对整个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)
    }
}

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

例如类似

type Test struct {
    Stats struct {
        LocalHostList []HostStatus `json:"localhost[0-9]"`
    }  `json:"stats"`
}

并使用类似localhost [0-9]之类的东西-即正则表达式语义将对JSON包产生冲击。

1 个答案:

答案 0 :(得分:3)

尝试一下:

type Test struct {
    Stats map[string]HostStatus `json:"stats"`
}