【发布时间】:2019-09-03 05:24:51
【问题描述】:
我不知道如何在不重写整个解析器的情况下使用不同的键序列化相同的 JSON 对象到 Go slice 结构。 例如,我可以接收回的 JSON,它可能包含 N 个具有不同键的数字对象(localhost1/localhost2/localhost3 等)。在这个例子中,我有一个key localhost1/localhost2/localhost3,每个只有一个字段ok。
{
"stats": {
"localhost1": {
"ok": 1
},
"localhost2": {
"ok": 1
},
"localhost3": {
"ok": 1
}
}
}
我可以使用以下 Structs 映射 Unmarsh 整个 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 包产生影响。
【问题讨论】: