处理动态字段时如何在 Go 中解组
How to unmarshal in Go when dealing with dynamic fields
我正在学习 Go 并尝试实现它。我的 JSON 数据如下所示:
{
"site1": [
"site1_router01",
"site1_router02"
],
"site2": [
"site2_router01",
"site2_router02",
"site2_router03",
"site2_router04"
],
"site3": [
"site3_router01",
"site3_router02"
]
}
如何为这种数据类型创建结构?
我试过这个:
type site map[string][]string
type siterouters struct {
site
}
func main() {
var input []byte
for in := bufio.NewScanner(os.Stdin); in.Scan(); {
input = append(input, in.Bytes()...)
input = append(input, '\n')
}
// fmt.Println(string(input))
data := []siterouters{}
if err := json.Unmarshal(input, &data); err != nil {
fmt.Println(err)
return
}
}
但是当我 运行 代码时,我得到这个错误:
go run test2.go < prod-slr.json
'json: cannot unmarshal object into Go value of type []main.siterouters
JSON 文件可以包含任意数量的站点,以及任意数量的与特定站点关联的路由器。网站将永远是独一无二的。
谢谢。
您创建了两个不必要的图层;如果引用的 JSON 在 [{"site":{
中,您的代码将起作用,但事实并非如此。摆脱两个外层 - 结构和切片 - 并直接解组到映射中:
data := map[string][]string{}
if err := json.Unmarshal(input, &data); err != nil {
fmt.Println(err)
return
}
fmt.Println(data)
我正在学习 Go 并尝试实现它。我的 JSON 数据如下所示:
{
"site1": [
"site1_router01",
"site1_router02"
],
"site2": [
"site2_router01",
"site2_router02",
"site2_router03",
"site2_router04"
],
"site3": [
"site3_router01",
"site3_router02"
]
}
如何为这种数据类型创建结构? 我试过这个:
type site map[string][]string
type siterouters struct {
site
}
func main() {
var input []byte
for in := bufio.NewScanner(os.Stdin); in.Scan(); {
input = append(input, in.Bytes()...)
input = append(input, '\n')
}
// fmt.Println(string(input))
data := []siterouters{}
if err := json.Unmarshal(input, &data); err != nil {
fmt.Println(err)
return
}
}
但是当我 运行 代码时,我得到这个错误:
go run test2.go < prod-slr.json
'json: cannot unmarshal object into Go value of type []main.siterouters
JSON 文件可以包含任意数量的站点,以及任意数量的与特定站点关联的路由器。网站将永远是独一无二的。 谢谢。
您创建了两个不必要的图层;如果引用的 JSON 在 [{"site":{
中,您的代码将起作用,但事实并非如此。摆脱两个外层 - 结构和切片 - 并直接解组到映射中:
data := map[string][]string{}
if err := json.Unmarshal(input, &data); err != nil {
fmt.Println(err)
return
}
fmt.Println(data)