Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menukar YAML kepada JSON dengan Selamat dalam Go Tanpa Kehilangan Integriti Data?

Bagaimana untuk Menukar YAML kepada JSON dengan Selamat dalam Go Tanpa Kehilangan Integriti Data?

Barbara Streisand
Barbara Streisandasal
2024-12-01 18:02:12202semak imbas

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

Menukar YAML kepada JSON Tanpa Pengikatan Struktur

Apabila bekerja dengan data dinamik dalam format YAML, selalunya perlu menukarnya kepada JSON untuk pemprosesan selanjutnya. Walau bagaimanapun, menyahmarshall YAML secara terus ke dalam antara muka kosong{} boleh mengakibatkan masalah apabila menemui jenis peta[antara muka{}]antara muka{}, seperti yang ditunjukkan dalam senario yang diberikan.

Penyelesaian: Penukaran Jenis Rekursif

Untuk menangani isu ini, fungsi rekursif yang dipanggil convert() digunakan. Fungsi ini berulang melalui nilai antara muka{} dan melakukan penukaran berikut:

  • Menukar nilai peta[antara muka{}]antara muka{} kepada memetakan[rentetan]antara muka{}.
  • Menukar nilai []antara muka{} kepada []antara muka{}.

Dengan berbuat demikian, nilai yang dikeluarkan boleh selamat disusun menjadi rentetan JSON.

Contoh

Berikut ialah contoh cara menggunakan fungsi 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))
    }
}

Output

The output program adalah yang ditukar JSON:

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

Nota

  • Dengan menukar kepada peta Go, susunan elemen hilang, jadi ia mungkin tidak sesuai untuk senario yang tertib adalah penting.
  • Versi fungsi convert() yang dioptimumkan dan dipertingkat telah dikeluarkan sebagai pustaka di github.com/icza/dyno. Ia menawarkan kemudahan dan fleksibiliti untuk mengendalikan data YAML dinamik.

Atas ialah kandungan terperinci Bagaimana untuk Menukar YAML kepada JSON dengan Selamat dalam Go Tanpa Kehilangan Integriti Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn