Heim >Backend-Entwicklung >Golang >Wie kann ich YAML in Go sicher in JSON konvertieren, ohne die Datenintegrität zu verlieren?

Wie kann ich YAML in Go sicher in JSON konvertieren, ohne die Datenintegrität zu verlieren?

Barbara Streisand
Barbara StreisandOriginal
2024-12-01 18:02:12205Durchsuche

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

YAML in JSON ohne Strukturbindung konvertieren

Bei der Arbeit mit dynamischen Daten im YAML-Format ist es oft notwendig, diese zur weiteren Verarbeitung in JSON zu konvertieren. Das direkte Unmarshalling von YAML in eine leere Schnittstelle{} kann jedoch zu Problemen führen, wenn auf Map[interface{}]interface{}-Typen gestoßen wird, wie im gegebenen Szenario gezeigt.

Lösung: Rekursive Typkonvertierung

Um dieses Problem zu beheben, wird eine rekursive Funktion namens „convert()“ verwendet. Diese Funktion durchläuft den Wert der Schnittstelle{} und führt die folgenden Konvertierungen durch:

  • Konvertiert die Werte von „map[interface{}]interface{} in „map[string]interface{}.
  • Konvertiert []interface{}-Werte in []interface{}.

Auf diese Weise kann der ausgegebene Wert sicher sein in eine JSON-Zeichenfolge gemarshallt.

Beispiel

Hier ist ein Beispiel für die Verwendung der Funktion „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))
    }
}

Ausgabe

Die Die Ausgabe des Programms ist die konvertierte JSON:

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

Hinweise

  • Durch die Konvertierung in Go-Karten geht die Reihenfolge der Elemente verloren, sodass sie möglicherweise nicht für Szenarien geeignet ist, in denen die Reihenfolge wichtig ist.
  • Eine optimierte und verbesserte Version der Funktion „convert()“ wurde als Bibliothek unter github.com/icza/dyno veröffentlicht. Es bietet Komfort und Flexibilität für den Umgang mit dynamischen YAML-Daten.

Das obige ist der detaillierte Inhalt vonWie kann ich YAML in Go sicher in JSON konvertieren, ohne die Datenintegrität zu verlieren?. 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