首页 >后端开发 >Golang >如何在 Go 中安全地将 YAML 转换为 JSON,而不丢失数据完整性?

如何在 Go 中安全地将 YAML 转换为 JSON,而不丢失数据完整性?

Barbara Streisand
Barbara Streisand原创
2024-12-01 18:02:12205浏览

How to Safely Convert YAML to JSON in Go Without Losing Data Integrity?

在没有结构体绑定的情况下将 YAML 转换为 JSON

使用 YAML 格式的动态数据时,通常需要将其转换为 JSON 以便进一步处理。然而,直接将 YAML 解组为空的 interface{} 可能会在遇到 map[interface{}]interface{} 类型时导致问题,如给定场景所示。

解决方案:递归类型转换

为了解决这个问题,使用了一个名为convert()的递归函数。该函数迭代interface{}值并执行以下转换:

  • 将map[interface{}]interface{}值转换为map[string]interface{}。
  • 将 []interface{} 值转换为 []interface{}。

通过这样做,输出的值可以安全地编组为 JSON 字符串。

示例

以下是如何使用 Convert() 函数的示例:

import (
    "fmt"
    "log"

    "github.com/go-yaml/yaml"
    "encoding/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
}

func main() {
    // Define the YAML string
    const s = `Services:
    -   Orders: 
        -   ID: $save ID1
            SupplierOrderCode: $SupplierOrderCode
        -   ID: $save ID2
            SupplierOrderCode: 111111
    `

    // Unmarshal the YAML string into an empty interface
    var body interface{}
    if err := yaml.Unmarshal([]byte(s), &body); err != nil {
        log.Fatal(err)
    }

    // Recursively convert the interface to a map[string]interface{}
    body = convert(body)

    // Marshal the converted interface into a JSON string
    if b, err := json.Marshal(body); err != nil {
        log.Fatal(err)
    } else {
        fmt.Println("Converted JSON:", string(b))
    }
}

输出

程序的输出是转换后的JSON:

Converted JSON: {"Services":[{"Orders":[
    {"ID":"$save ID1","SupplierOrderCode":"$SupplierOrderCode"},
    {"ID":"$save ID2","SupplierOrderCode":111111}]}]}

注释

  • 通过转换为Go映射,元素的顺序会丢失,因此可能不适合顺序很重要的场景。
  • convert() 函数的优化和改进版本已作为库发布在 github.com/icza/dyno 上。它为处理动态 YAML 数据提供了便利和灵活性。

以上是如何在 Go 中安全地将 YAML 转换为 JSON,而不丢失数据完整性?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn