使用 YAML 格式的动态数据时,通常需要将其转换为 JSON 以便进一步处理。然而,直接将 YAML 解组为空的 interface{} 可能会在遇到 map[interface{}]interface{} 类型时导致问题,如给定场景所示。
为了解决这个问题,使用了一个名为convert()的递归函数。该函数迭代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 中安全地将 YAML 转换为 JSON,而不丢失数据完整性?的详细内容。更多信息请关注PHP中文网其他相关文章!