如何将带有动态键的YAML反序列化为指定Struct类型的数组
解决方案
该需求完全可以实现,核心逻辑是先将动态键的mappings字段反序列化为通用map[string][]string类型,再遍历转换为目标结构体数组即可,无需复杂的自定义反序列化逻辑。
实现步骤
- 定义临时接收结构体,匹配YAML的根层级结构,其中mappings字段声明为
map[string][]string类型适配动态键 - 调用YAML解析库的反序列化方法,将原始YAML内容解析到临时结构体中
- 遍历map的所有键值对,将键作为
ExternalGroup字段值、值作为Scopes字段值,组装成目标结构体实例并添加到结果数组中
完整示例代码
以下是基于gopkg.in/yaml.v3库的可运行示例:
package main import ( "fmt" "gopkg.in/yaml.v3" ) // 目标数据结构 type ExternalGroupMapping struct { ExternalGroup string Scopes []string } // 临时接收结构,匹配YAML原始结构 type RawYAMLContent struct { Mappings map[string][]string `yaml:"mappings"` } func main() { // 替换为你的实际YAML数据源 rawYAML := ` mappings: extgroup1: - somescope1 - somescope2 someextgroup: - somescope3 allusers: - somescope1 ` // 第一步:反序列化到临时结构 var raw RawYAMLContent if err := yaml.Unmarshal([]byte(rawYAML), &raw); err != nil { panic(fmt.Sprintf("解析YAML失败:%v", err)) } // 第二步:转换为目标结构数组 var res []ExternalGroupMapping for groupName, scopesList := range raw.Mappings { res = append(res, ExternalGroupMapping{ ExternalGroup: groupName, Scopes: scopesList, }) } // 输出验证结果 for _, item := range res { fmt.Printf("ExternalGroup: %s, Scopes: %v\n", item.ExternalGroup, item.Scopes) } }
补充说明
如果你对最终数组的元素顺序有要求,可以在转换完成后,根据ExternalGroup字段对结果数组做自定义排序即可。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

