YAML 形式の動的データを扱う場合、多くの場合、さらに処理するためにデータを JSON に変換する必要があります。ただし、YAML を空のインターフェースに直接アンマーシャリングすると、指定されたシナリオで示されているように、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 中国語 Web サイトの他の関連記事を参照してください。