Tukar YAML kepada JSON Secara Dinamik tanpa Struktur Tertakrif
Anda mempunyai rentetan konfigurasi YAML dinamik yang anda mahu tukar kepada JSON. Walau bagaimanapun, anda tidak boleh mentakrifkan struct untuk JSON kerana struktur data tidak diketahui.
Untuk mengatasi cabaran ini, anda boleh menggunakan fungsi yaml.Unmarshal() untuk menghuraikan YAML ke dalam nilai antara muka{}. Ini akan menghasilkan struktur data bersarang peta dan kepingan dengan jenis antara muka lalai{}.
Masalah timbul apabila anda cuba menukar nilai antara muka{} ini kembali kepada JSON menggunakan json.Marshal(). Ia akan gagal kerana json.Marshal() tidak menyokong jenis peta[antara muka{}]antara muka{}.
Untuk mengendalikan struktur data dinamik ini, anda perlu menukar antara muka peta[antara muka{}] secara rekursif nilai {} untuk memetakan nilai [rentetan]antara muka{}. Ini memastikan bahawa semua peta mempunyai kunci rentetan, yang disokong oleh JSON.
Berikut ialah contoh fungsi penukar:
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 }
Menggunakan fungsi ini, anda boleh menukar nilai antara muka{} kepada Struktur data serasi JSON:
body = convert(body)
Kini, anda boleh menggunakan json.Marshal() untuk menukar ditukarkan badan kepada rentetan JSON.
Berikut ialah contoh lengkap:
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) } }
Output:
Output: {"Services":[{"Orders":[{"ID":"$save ID1","SupplierOrderCode":"$SupplierOrderCode"},{"ID":"$save ID2","SupplierOrderCode":111111}]}]}
Perhatikan bahawa susunan elemen dalam output JSON mungkin berbeza daripada YAML asal kerana sifat peta Go yang tidak teratur.
Atas ialah kandungan terperinci Bagaimana untuk Menukar YAML kepada JSON secara Dinamik dalam Go tanpa Struktur Pratakrif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!