ホームページ >バックエンド開発 >Golang >データの整合性を失わずに Go で YAML を JSON に安全に変換するにはどうすればよいですか?

データの整合性を失わずに Go で YAML を JSON に安全に変換するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-01 18:02:12202ブラウズ

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

構造体バインディングを使用しない YAML から JSON への変換

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。