Apabila cuba menyahmarshal JSON ke dalam struct, anda mungkin menghadapi senario di mana medan tertentu mempunyai teg "json". Teg ini memerlukan pengendalian khas untuk memastikan data JSON ditukar dengan betul kepada format rentetan yang diingini dalam struct.
Dalam contoh yang disediakan, struct A mempunyai medan S yang ditandakan dengan sql:"type:json". Matlamatnya adalah untuk menyahmarshal nilai "S" dalam data JSON yang disediakan ke dalam format rentetan dalam struct A.
Pada mulanya, anda mungkin telah mempertimbangkan untuk menggunakan refleksi untuk menyemak sama ada teg medan mengandungi rentetan "json " dan kemudian nyahmarshal data JSON ke dalam medan itu sebagai rentetan. Walau bagaimanapun, pendekatan yang lebih cekap dan elegan ialah menggunakan ciri perpustakaan standard Go.
Salah satu cara untuk mencapai ini ialah dengan mentakrifkan RawString jenis tersuai dan melaksanakan Kaedah MarshalJSON dan UnmarshalJSON untuknya. Kaedah ini menyediakan cara untuk mengawal cara data JSON dikodkan dan dinyahkodkan, masing-masing.
Dalam contoh ini, jenis RawString membungkus nilai rentetan. Kaedah MarshalJSON mengembalikan nilai rentetan sebagai kepingan bait, manakala kaedah UnmarshalJSON menambahkan data yang diterima pada RawString sedia ada.
Langkah seterusnya ialah mentakrifkan A struct, yang merangkumi medan I (integer 64-bit) dan medan S jenis RawString.
Menggunakan jenis dan kaedah tersuai ini, anda boleh menyahmarshal data JSON yang disediakan ke dalam struct A. Kod Go berikut menunjukkan perkara ini:
<code class="go">import ( "encoding/json" "fmt" "log" ) // RawString is a raw encoded JSON object. // It implements Marshaler and Unmarshaler and can // be used to delay JSON decoding or precompute a JSON encoding. type RawString string // MarshalJSON returns *m as the JSON encoding of m. func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } // UnmarshalJSON sets *m to a copy of data. func (m *RawString) UnmarshalJSON(data []byte) error { if m == nil { return errors.New("RawString: UnmarshalJSON on nil pointer") } *m += RawString(data) return nil } const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` type A struct { I int64 S RawString `sql:"type:json"` } func main() { a := A{} err := json.Unmarshal([]byte(data), &a) if err != nil { log.Fatal("Unmarshal failed", err) } fmt.Println("Done", a) }</code>
Dengan menggunakan pendekatan ini, anda boleh menyahmarshal data JSON ke dalam struct dengan medan yang ditandakan dengan "json" dan mengekalkan format rentetan asalnya.
Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal JSON ke dalam Struct dengan Medan yang Ditandakan dengan \'json\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!