gpt4 book ai didi

JSON Unmarshal 不适用于 relect 创建的动态结构

转载 作者:行者123 更新时间:2023-12-01 22:14:03 25 4
gpt4 key购买 nike

我正在尝试使用动态创建的结构来解析 JSON 文件,但显然我做错了什么。有人可以告诉我们我在这里做错了什么:

structured := make(map[string][]reflect.StructField)
structured["Amqp1"] = []reflect.StructField{
reflect.StructField{
Name: "Test",
Type: reflect.TypeOf(""),
Tag: reflect.StructTag(`json:"test"`),
},
reflect.StructField{
Name: "Float",
Type: reflect.TypeOf(5.5),
Tag: reflect.StructTag(`json:"float"`),
},
reflect.StructField{
Name: "Connections",
Type: reflect.TypeOf([]Connection{}),
Tag: reflect.StructTag(`json:"connections"`),
},
}

sections := []reflect.StructField{}
for sect, params := range structured {
sections = append(sections,
reflect.StructField{
Name: sect,
Type: reflect.StructOf(params),
},
)
}

parsed := reflect.New(reflect.StructOf(sections)).Elem()
if err := json.Unmarshal([]byte(JSONConfigContent), &parsed); err != nil {
fmt.Printf("unable to parse data from provided configuration file: %s\n", err)
os.Exit(1)
}

https://play.golang.org/p/C2I4Pduduyg

提前致谢。

最佳答案

您要使用 .Interface() 返回实际的底层值,它应该是指向具体匿名结构的指针。

请注意 reflect.New函数返回 reflect.Value表示指向指定类型的新零值的指针。 Interface在这种情况下,方法将该指针返回为 interface{}这就是您所需要的 json.Unmarshal .

如果在解码后,您需要结构的非指针,您可以再次反射并使用 reflect.ValueOf(parsed).Elem().Interface()有效地取消对指针的引用。

parsed := reflect.New(reflect.StructOf(sections)).Interface()
if err := json.Unmarshal([]byte(JSONConfigContent), parsed); err != nil {
fmt.Printf("unable to parse data from provided configuration file: %s\n", err)
os.Exit(1)
}

https://play.golang.org/p/Bzu1hUyKjvM

关于JSON Unmarshal 不适用于 relect 创建的动态结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61668746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com