Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Menyahmarshal Data JSON dengan Medan Berteg dalam Go?
Cara Menyahmarshal JSON dengan Medan Berteg
Apabila menyahmarshall JSON ke dalam struct, mungkin perlu menentukan cara medan tertentu dikendalikan. Untuk melakukan ini, teg boleh ditambah pada medan struct untuk memberikan maklumat tambahan kepada proses unmarshaling.
Dalam senario di mana anda perlu menyahmarshal medan JSON sebagai rentetan ke dalam medan struct dengan tag, a penyelesaian mudah menggunakan refleksi boleh dilaksanakan:
<code class="go">package main import ( "encoding/json" "fmt" "log" "reflect" ) type A struct { I int64 S string `sql:"type:json"` } const data = `{ "I": 3, "S": { "phone": { "sales": "2223334444" } } }` func main() { var a A err := json.Unmarshal([]byte(data), &a) if err != nil { log.Fatal("Unmarshal failed", err) } rt := reflect.TypeOf(a) rv := reflect.ValueOf(&a) for i := 0; i < rt.NumField(); i++ { f := rt.Field(i) if f.Tag.Get("json") != "" { fv := rv.Elem().Field(i) fv.SetString(string(fv.Bytes())) } } fmt.Println("Done", a) }</code>
Walau bagaimanapun, pendekatan yang lebih elegan tersedia dalam Go yang menghilangkan keperluan untuk refleksi:
<code class="go">package main 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>
Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal Data JSON dengan Medan Berteg dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!