Heim > Backend-Entwicklung > Golang > Wie kann ich YAML in Go ohne vordefinierte Strukturen dynamisch in JSON konvertieren?

Wie kann ich YAML in Go ohne vordefinierte Strukturen dynamisch in JSON konvertieren?

Patricia Arquette
Freigeben: 2024-11-28 14:57:14
Original
513 Leute haben es durchsucht

How to Dynamically Convert YAML to JSON in Go without Predefined Structs?

YAML dynamisch in JSON konvertieren, ohne eine definierte Struktur

Sie haben eine dynamische YAML-Konfigurationszeichenfolge, die Sie in JSON konvertieren möchten. Sie können jedoch keine Struktur für JSON definieren, da die Datenstruktur unbekannt ist.

Um diese Herausforderung zu meistern, können Sie die Funktion yaml.Unmarshal() verwenden, um die YAML in einen interface{}-Wert zu analysieren. Dadurch wird eine verschachtelte Datenstruktur aus Karten und Slices mit dem Standardtyp „interface{}“ erstellt.

Das Problem tritt auf, wenn Sie versuchen, diesen Wert „interface{}“ mithilfe von json.Marshal() zurück in JSON zu konvertieren. Dies schlägt fehl, da json.Marshal() den Typ „map[interface{}]interface{} nicht unterstützt.

Um diese dynamische Datenstruktur zu verarbeiten, müssen Sie die Schnittstelle „map[interface{}]rekursiv konvertieren {}-Werte zur Zuordnung von[string]interface{}-Werten. Dadurch wird sichergestellt, dass alle Karten über Zeichenfolgenschlüssel verfügen, die von JSON unterstützt werden.

Hier ist eine Beispielkonverterfunktion:

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
}
Nach dem Login kopieren

Mit dieser Funktion können Sie den Wert von interface{} in einen konvertieren JSON-kompatible Datenstruktur:

body = convert(body)
Nach dem Login kopieren

Jetzt können Sie json.Marshal() verwenden, um den konvertierten Text in ein JSON zu konvertieren string.

Hier ist ein vollständiges Beispiel:

func main() {
    const s = `Services:
-   Orders:
    -   ID: $save ID1
        SupplierOrderCode: $SupplierOrderCode
    -   ID: $save ID2
        SupplierOrderCode: 111111
`
    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)
    }
}
Nach dem Login kopieren

Ausgabe:

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

Beachten Sie, dass die Reihenfolge der Elemente in der JSON-Ausgabe von der ursprünglichen YAML-Ausgabe abweichen kann zur ungeordneten Natur von Go-Karten.

Das obige ist der detaillierte Inhalt vonWie kann ich YAML in Go ohne vordefinierte Strukturen dynamisch in JSON konvertieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage