Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menukar YAML kepada JSON dengan Cekap dengan Data Dinamik dan Tiada Struktur?

Bagaimana untuk Menukar YAML kepada JSON dengan Cekap dengan Data Dinamik dan Tiada Struktur?

DDD
DDDasal
2024-11-27 19:54:11775semak imbas

How to Efficiently Convert YAML to JSON with Dynamic Data and No Structs?

Penukaran YAML kepada JSON untuk Data Dinamik tanpa Struktur

Apabila berurusan dengan data dinamik yang tidak boleh dipetakan kepada struct, menukar YAML kepada JSON boleh menimbulkan cabaran. Pertimbangkan rentetan YAML berikut:

Services: 
-   Orders: 
    -   ID: $save ID1
        SupplierOrderCode: $SupplierOrderCode
    -   ID: $save ID2
        SupplierOrderCode: 111111

Untuk menukar rentetan YAML ini kepada JSON, satu pendekatan ialah menyahmarshalkannya menjadi jenis antara muka{}. Walau bagaimanapun, ini menyebabkan jenis tidak disokong, kerana jenis lalai yang digunakan untuk menyahmarshal pasangan nilai kunci ialah map[antara muka{}]antara muka{}.

Untuk mengatasi isu ini, kita perlu menukar peta[antara muka{ }]nilai{} antara muka untuk memetakan nilai [rentetan]antara muka{} secara rekursif. Berikut ialah fungsi yang melakukan penukaran ini:

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
}

Menggunakan fungsi ini, kita boleh menukar rentetan YAML kepada JSON seperti berikut:

import (
    "encoding/json"
    "fmt"
    "github.com/go-yaml/yaml"
)

const s = `Services:
-   Orders:
    -   ID: $save ID1
        SupplierOrderCode: $SupplierOrderCode
    -   ID: $save ID2
        SupplierOrderCode: 111111
`

func main() {
    fmt.Printf("Input: %s\n", s)
    var body interface{}
    if err := yaml.Unmarshal([]byte(s), &body); err != nil {
        panic(err)
    }

    body = convert(body)

    if b, err := json.Marshal(body); err != nil {
        panic(err)
    } else {
        fmt.Printf("Output: %s\n", b)
    }
}

Output:

Input: Services:
-   Orders:
    -   ID: $save ID1
        SupplierOrderCode: $SupplierOrderCode
    -   ID: $save ID2
        SupplierOrderCode: 111111

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

Atas ialah kandungan terperinci Bagaimana untuk Menukar YAML kepada JSON dengan Cekap dengan Data Dinamik dan Tiada Struktur?. 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