Heim >Backend-Entwicklung >Golang >Wie konvertiert man YAML effizient in JSON mit dynamischen Daten und ohne Strukturen?

Wie konvertiert man YAML effizient in JSON mit dynamischen Daten und ohne Strukturen?

DDD
DDDOriginal
2024-11-27 19:54:11721Durchsuche

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

YAML-zu-JSON-Konvertierung für dynamische Daten ohne Strukturen

Beim Umgang mit dynamischen Daten, die nicht einer Struktur zugeordnet werden können, Konvertierung von YAML in JSON kann Herausforderungen mit sich bringen. Betrachten Sie die folgende YAML-Zeichenfolge:

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

Um diese YAML-Zeichenfolge in JSON zu konvertieren, besteht ein Ansatz darin, sie in einen Interface{}-Typ zu entmarshalieren. Dies führt jedoch zu nicht unterstützten Typen, da der Standardtyp, der zum Entmarshalieren von Schlüssel-Wert-Paaren verwendet wird, „map[interface{}]interface{}“ ist.

Um dieses Problem zu lösen, müssen wir „map[interface{“ konvertieren. }]interface{}-Werte, um [string]interface{}-Werte rekursiv abzubilden. Hier ist eine Funktion, die diese Konvertierung durchführt:

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
}

Mit dieser Funktion können wir den YAML-String wie folgt in JSON konvertieren:

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)
    }
}

Ausgabe:

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}]}]}

Das obige ist der detaillierte Inhalt vonWie konvertiert man YAML effizient in JSON mit dynamischen Daten und ohne Strukturen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn