Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah `json.Decoder` Go Boleh Menstrim Menyahkod Respons JSON Besar dengan Cekap?
Dalam Go, penyahkodan JSON daripada titik akhir API secara tradisinya dilakukan dengan memuatkan keseluruhan respons ke dalam memori, seperti ditunjukkan dalam pendekatan masa lalu. Walau bagaimanapun, pengendalian respons JSON yang besar, terutamanya yang mengandungi tatasusunan dengan panjang yang ketara, memerlukan kaedah yang lebih cekap.
Untuk mengelakkan memori yang berlebihan, artikel ini meneroka penggunaan json.Decoder Go dan keupayaan penghuraian terdorong peristiwa untuk mengendalikan strim JSON dengan berkesan.
json.Decoder menyediakan cara untuk menyahkod data JSON kerana ia masih menstrim masuk, tanpa menggunakan keseluruhan strim. Ini membolehkan pemprosesan respons JSON yang besar secara berperingkat-peringkat.
Untuk melaksanakan penyahkod JSON penstriman, kami menggunakan Decoder.Token() untuk mendapatkan semula individu token dalam aliran JSON. Dengan mentafsir token ini, kami boleh membina mesin keadaan yang menjejaki kedudukan kami dalam struktur JSON.
Pertimbangkan struktur JSON berikut:
{ "somefield": "value", "otherfield": "othervalue", "items": [ { "id": "1", "data": "data1" }, { "id": "2", "data": "data2" }, ... ] }
Matlamat kami adalah untuk memproses aliran JSON ini, menangkap setiap objek besar (diwakili oleh tatasusunan "item") tanpa perlu menyahkod keseluruhan struktur.
dec := json.NewDecoder(res.Body) // or strings.NewReader(jsonStream) for demonstration purposes // Parse the outer JSON structure _, err := dec.Token() // Expecting an object if err != nil { ... } // Iterate over properties for dec.More() { prop, err := dec.Token().(string) // Property name if err != nil { ... } if prop != "items" { var v interface{} // Decode property value if err := dec.Decode(&v); err != nil { ... } log.Printf("Property '%s' = %v", prop, v) continue } // Parse items array _, err := dec.Token() // Expecting array if err != nil { ... } // Read and process items for dec.More() { lo := LargeObject{} // Initialize large object struct if err := dec.Decode(&lo); err != nil { ... } fmt.Printf("Item: %+v\n", lo) } _, err := dec.Token() // Expecting array closing if err != nil { ... } } // Parse outer object closing _, err := dec.Token() // Expecting object closing if err != nil { ... }
Contoh yang disediakan akan menghasilkan output berikut, menunjukkan kejayaan pemprosesan objek besar daripada aliran JSON:
Property 'somefield' = value Property 'otherfield' = othervalue Item: {Id:1 Data:data1} Item: {Id:2 Data:data2} ...
Dengan menggunakan json.Decoder's keupayaan penghuraian dipacu peristiwa, pembangun boleh mengendalikan respons JSON yang besar dengan cekap, mengelakkan beban memori yang berlebihan dan membolehkan pemprosesan data penstriman masa nyata. Pelaksanaan yang dibentangkan berfungsi sebagai panduan praktikal untuk melaksanakan penyahkod sedemikian dalam Go.
Atas ialah kandungan terperinci Bagaimanakah `json.Decoder` Go Boleh Menstrim Menyahkod Respons JSON Besar dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!