Heim >Backend-Entwicklung >Golang >Wie kann ich YAML in Go ohne vordefinierte Strukturen dynamisch in JSON konvertieren?
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!