Apabila berurusan dengan mesej JSON yang mengandungi jenis data yang berbeza, pendekatan biasa mungkin melibatkan pembongkaran data ke dalam peta generik[ string]antara muka{} untuk memeriksa kunci dan cuba menghantar nilai ke dalam struktur tertentu. Walau bagaimanapun, pendekatan ini boleh membawa kepada unmarshaling berganda yang tidak perlu.
Dalam konteks Go, terdapat penyelesaian yang lebih cekap untuk menyahmarshal sebahagian data JSON ke dalam json.RawMessage dan bukannya antara muka{}. Ini dicapai dengan mengisytiharkan peta sebagai:
var myMap map[string]json.RawMessage
Apabila ia datang untuk menghantar nilai kepada struct tertentu, langkah marshaling/unmarshaling boleh dihapuskan. Sebagai contoh, dalam kes anda, anda telah menghantar ke struct "Ack" anda menggunakan:
ackjson, err := json.Marshal(v) if err != nil { fmt.Println("marshal error: ", err) } err = json.Unmarshal(ackjson, &myAck) if err != nil { fmt.Println("unmarshal error", err) }
Sebaliknya, ia boleh dipermudahkan kepada:
err = json.Unmarshal(v, &myAck)
Pendekatan ini mengelakkan pembongkaran yang berlebihan langkah, menjadikan penghuraian lebih cekap.
Berikut ialah versi terkini kod anda yang menggabungkan ini pengoptimuman:
package main import ( "encoding/json" "fmt" ) type Ping struct { Ping string `json:"ping"` } type Ack struct { Messages []Message `json:"messages"` } type Message string func main() { testJSON := []byte(`{"ack":{"messages":["Hi there","Hi again"]}}`) var myAck = Ack{} var myMap map[string]json.RawMessage err := json.Unmarshal(testJSON, &myMap) if err != nil { fmt.Println("error unmarshalling: ", err) } for k, v := range myMap { fmt.Printf("key: %s, value: %s \n", k, v) switch k { case "ping": fmt.Println(k, " is a ping", v) case "ack": fmt.Println(k, " is an ack containing a message list") err = json.Unmarshal(v, &myAck) if err != nil { fmt.Println("unmarshal error", err) } else { fmt.Println("New ack object: ", myAck) } default: fmt.Printf("%s is of a type (%T) I don't know how to handle", k, v) } } }
Dengan menggunakan json.RawMessage dan menghapuskan unmarshaling yang tidak perlu, anda boleh meningkatkan prestasi penghuraian JSON anda tanpa menjejaskan fungsi.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghuraikan JSON dengan Cekap dalam Pergi Tanpa Unmarshaling Berlebihan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!