Map 使用接口动态映射YAML的更简单方法?
我试图动态解析yaml文件(因此没有结构) 每次我必须访问子键时,我都被迫将相关的map变量转换为(map[interface{}]interface{})。这给我带来了一点麻烦,因为我必须遍历地图Map 使用接口动态映射YAML的更简单方法?,map,go,yaml,Map,Go,Yaml,我试图动态解析yaml文件(因此没有结构) 每次我必须访问子键时,我都被迫将相关的map变量转换为(map[interface{}]interface{})。这给我带来了一点麻烦,因为我必须遍历地图 有没有更简单的方法来解析Go中的YAML文件?另一种方法是将YAML数据结构扁平化为键和值映射,其中键和值是字符串。然后,如果您需要实际的类型(5是一个int),您可以自己进行转换。例如: "a" = "First!" "f" = "Second" "b.c.f" = "Third" "b.c.g.
有没有更简单的方法来解析Go中的YAML文件?另一种方法是将YAML数据结构扁平化为键和值映射,其中键和值是字符串。然后,如果您需要实际的类型(5是一个int),您可以自己进行转换。例如:
"a" = "First!"
"f" = "Second"
"b.c.f" = "Third"
"b.c.g.size" = "2"
"b.c.g.0 = "zero"
"b.c.g.1 = "one"
围棋:
func main() {
any := map[string]interface{}{}
err := yaml.Unmarshal([]byte(out), &any)
if err != nil {
log.Fatal(err)
}
flatmap := map[string]string{}
for k, v := range any {
flatten(k, v, flatmap)
}
for k, v := range flatmap {
fmt.Println(k, "=", v)
}
}
func flatten(prefix string, value interface{}, flatmap map[string]string) {
submap, ok := value.(map[interface{}]interface{})
if ok {
for k, v := range submap {
flatten(prefix+"."+k.(string), v, flatmap)
}
return
}
stringlist, ok := value.([]interface{})
if ok {
flatten(fmt.Sprintf("%s.size", prefix), len(stringlist), flatmap)
for i, v := range stringlist {
flatten(fmt.Sprintf("%s.%d", prefix, i), v, flatmap)
}
return
}
flatmap[prefix] = fmt.Sprintf("%v", value)
}
我不知道这个特定的库,但通过在JSON和XML中执行相同的操作,最简单的方法是反序列化一个比泛型字典更严格类型的结构。严格来说,没有结构。。返回结构是不可预测的。您至少可以假设键总是字符串吗?您至少可以使用
map[string]interface{}
并减少强制转换。但它仍然不优雅。我可以这样索引它吗。。m[“b”][“c”]?
func main() {
any := map[string]interface{}{}
err := yaml.Unmarshal([]byte(out), &any)
if err != nil {
log.Fatal(err)
}
flatmap := map[string]string{}
for k, v := range any {
flatten(k, v, flatmap)
}
for k, v := range flatmap {
fmt.Println(k, "=", v)
}
}
func flatten(prefix string, value interface{}, flatmap map[string]string) {
submap, ok := value.(map[interface{}]interface{})
if ok {
for k, v := range submap {
flatten(prefix+"."+k.(string), v, flatmap)
}
return
}
stringlist, ok := value.([]interface{})
if ok {
flatten(fmt.Sprintf("%s.size", prefix), len(stringlist), flatmap)
for i, v := range stringlist {
flatten(fmt.Sprintf("%s.%d", prefix, i), v, flatmap)
}
return
}
flatmap[prefix] = fmt.Sprintf("%v", value)
}