首页 > 后端开发 > Golang > 如何在没有预定义结构的情况下在 Go 中动态地将 YAML 转换为 JSON?

如何在没有预定义结构的情况下在 Go 中动态地将 YAML 转换为 JSON?

Patricia Arquette
发布: 2024-11-28 14:57:14
原创
552 人浏览过

How to Dynamically Convert YAML to JSON in Go without Predefined Structs?

在没有定义结构的情况下将 YAML 动态转换为 JSON

您有一个要转换为 JSON 的动态 YAML 配置字符串。但是,您无法为 JSON 定义结构,因为数据结构未知。

要克服这一挑战,您可以使用 yaml.Unmarshal() 函数将 YAML 解析为 interface{} 值。这将生成具有默认 interface{} 类型的映射和切片的嵌套数据结构。

当您尝试使用 json.Marshal() 将此 interface{} 值转换回 JSON 时,就会出现问题。会失败,因为json.Marshal()不支持map[interface{}]interface{}类型。

要处理这种动态数据结构,需要递归转换map[interface{}]接口{} 值映射[string]interface{} 值。这可确保所有映射都具有 JSON 支持的字符串键。

以下是一个示例转换器函数:

func convert(i interface{}) interface{} {
    switch x := i.(type) {
    case map[interface{}]interface{}:
        m2 := map[string]interface{}{}
        for k, v := range x {
            m2[k.(string)] = convert(v)
        }
        return m2
    case []interface{}:
        for i, v := range x {
            x[i] = convert(v)
        }
    }
    return i
}
登录后复制

使用此函数,您可以将 interface{} 值转换为JSON 兼容的数据结构:

body = convert(body)
登录后复制

现在,您可以使用 json.Marshal() 将转换后的正文转换为 JSON string.

这是一个完整的示例:

func main() {
    const s = `Services:
-   Orders:
    -   ID: $save ID1
        SupplierOrderCode: $SupplierOrderCode
    -   ID: $save ID2
        SupplierOrderCode: 111111
`
    var body interface{}
    if err := yaml.Unmarshal([]byte(s), &body); err != nil {
        panic(err)
    }

    body = convert(body)

    if b, err := json.Marshal(body); err != nil {
        panic(err)
    } else {
        fmt.Printf("Output: %s\n", b)
    }
}
登录后复制

输出:

Output: {"Services":[{"Orders":[{"ID":"$save ID1","SupplierOrderCode":"$SupplierOrderCode"},{"ID":"$save ID2","SupplierOrderCode":111111}]}]}
登录后复制

请注意,JSON 输出中的元素顺序可能与原始 YAML 不同,因为Go 地图的无序性质。

以上是如何在没有预定义结构的情况下在 Go 中动态地将 YAML 转换为 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板