Apabila berurusan dengan respons JSON, mungkin perlu untuk mengekalkan objek bersarang tertentu sebagai rentetan mentah atau tatasusunan bait dan bukannya memintanya dihuraikan ke dalam struktur Go. Untuk menangani perkara ini, kami akan meneroka penyelesaian menggunakan jenis json.RawMessage daripada pengekodan/pakej json.
Dalam senario khusus anda, JSON berikut:
{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }
hendaklah dibatalkan ke dalam struktur Go dengan medan ID jenis int64 dan medan Foo jenis []bait. Ralat yang anda temui, "json: cannot unmarshal object into Go value of type []uint8," menunjukkan bahawa proses unmarshalling sedang cuba menghuraikan objek foo ke dalam nilai Go, yang bukan tingkah laku yang dimaksudkan.
Jenis json.RawMessage menyediakan penyelesaian untuk masalah ini. Seperti yang dinyatakan oleh dokumentasinya, ia ialah "objek JSON yang dikodkan mentah" yang boleh digunakan untuk menangguhkan penyahkodan JSON atau prakiraan pengekodan JSON. Menggunakan json.RawMessage, anda boleh mengekalkan objek foo sebagai tatasusunan bait mentah dalam struktur Go anda dengan berkesan:
import ( "encoding/json" "fmt" ) type Bar struct { ID int64 `json:"id"` Foo json.RawMessage `json:"foo"` } func main() { var jsonStr = []byte(`{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }`) var bar Bar err := json.Unmarshal(jsonStr, &bar) if err != nil { panic(err) } fmt.Printf("%+v\n", bar) }
Output:
{Id:15 Foo:[123 32 34 102 111 111 34 58 32 49 50 51 44 32 34 98 97 114 34 58 32 34 98 97 122 34 32 125]}
Dengan memanfaatkan json.RawMessage, anda boleh kini berjaya Unmarshal JSON ke dalam struktur Go yang menganggap objek foo sebagai tatasusunan bait.
Atas ialah kandungan terperinci Bagaimana untuk Membongkar Objek Bersarang JSON sebagai Tatasusunan Byte dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!