使用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中文網其他相關文章!