Apabila Menyahmarshall data JSON, selalunya wajar untuk menganggap objek bersarang sebagai nilai legap, dan bukannya menghuraikannya ke dalam jenis Go. Ini boleh dicapai menggunakan jenis RawMessage yang disediakan oleh pakej pengekodan/json.
Pertimbangkan struct JSON dan Go berikut:
{ "id": 15, "foo": { "foo": 123, "bar": "baz" } }
type Bar struct { Id int64 Foo []byte }
Percubaan untuk Unmarshal JSON ini ke dalam struct Bar menghasilkan perkara berikut ralat:
json: cannot unmarshal object into Go value of type []uint8
Untuk mengekalkan objek bersarang sebagai rentetan atau kepingan bait, gunakan jenis RawMessage:
type Bar struct { Id int64 Foo json.RawMessage }
Seperti yang diterangkan dalam dokumentasi , RawMessage ialah objek JSON yang dikodkan mentah yang melaksanakan kedua-dua Marshaler dan Unmarshaler antara muka.
Berikut ialah contoh yang berfungsi:
package main import ( "encoding/json" "fmt" ) var jsonStr = []byte(`{ "id": 15, "foo": { "foo": 123, "bar": "baz" } }`) type Bar struct { Id int64 Foo json.RawMessage } func main() { var bar Bar if err := json.Unmarshal(jsonStr, &bar); err != nil { panic(err) } fmt.Printf("%+v", 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]}
[Taman Permainan pautan](https://play.golang.org/p/L2yJj2e72dS)
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Objek JSON Bersarang sebagai Rentetan atau Bait dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!