Menyahmarshal JSON dengan Pengendalian Teg Tersuai
Apabila cuba menyahmarshal JSON ke dalam struct, anda mungkin perlu mengendalikan medan dengan teg tersuai secara berbeza . Artikel ini meneroka isu di mana medan dalam struct mempunyai teg yang menunjukkan bahawa ia harus dibongkar sebagai rentetan.
Masalah:
Pertimbangkan rentetan JSON dan rentetan struct yang sepadan:
<code class="json">{ "I": 3, "S": { "phone": { "sales": "2223334444" } } }</code>
<code class="go">type A struct { I int64 S string `sql:"type:json"` }</code>
Matlamatnya adalah untuk menyahmarshal medan "S" sebagai rentetan, bukannya struct.
Penyelesaian:
Menggunakan Antara Muka Marshaler/Unmarshaler:
Go menyediakan cara untuk mengatasi tingkah laku marshaler dan unmarshaler JSON lalai dengan melaksanakan antara muka Marshaler dan Unmarshaler untuk jenis tersuai. Dalam kes ini, cipta jenis baharu yang dipanggil RawString dan laksanakan fungsi ini:
<code class="go">type RawString string func (m *RawString) MarshalJSON() ([]byte, error) { return []byte(*m), nil } func (m *RawString) UnmarshalJSON(data []byte) error { if m == nil { return errors.New("RawString: UnmarshalJSON on nil pointer") } *m += RawString(data) return nil }</code>
Memohon pada Struct:
Ubah suai struct A untuk menggunakan jenis RawString untuk medan "S":
<code class="go">type A struct { I int64 S RawString `sql:"type:json"` }</code>
Dengan pelaksanaan ini, apabila JSON dinyahmarselkan ke dalam struct A, medan "S" akan dinyahmarshall sebagai rentetan, mengekalkan perwakilan JSON asalnya.
Contoh Penggunaan:
<code class="go">const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}` func main() { a := A{} err := json.Unmarshal([]byte(data), &a) if err != nil { log.Fatal("Unmarshal failed:", err) } fmt.Println("Done", a) }</code>
Output:
<code class="text">Done {3 {"phone": {"sales": "2223334444"}}}</code>
Atas ialah kandungan terperinci Bagaimana untuk Unmarshal JSON dengan Pengendalian Teg Tersuai untuk Perwakilan Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!