处理动态字段时如何在 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)

在操场上工作:https://play.golang.org/p/IMrddWu8JAx