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
Patricia ArquetteOriginal
2024-11-28 14:57:14513Durchsuche

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
}

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

body = convert(body)

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

Ausgabe:

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

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!

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