Menyahmarshalling JSON yang Tidak Konsisten dengan Tatasusunan dan Rentetan
Menyahmarshalling JSON boleh mencabar apabila data tidak konsisten, seperti apabila medan boleh sama ada rentetan atau tatasusunan rentetan. Untuk mengendalikan senario ini, kami boleh menggunakan pelbagai strategi.
Menangkap Variasi Data Menggunakan RawMessage
Untuk medan dengan pelbagai jenis, kami boleh menggunakan json.RawMessage untuk menangkap yang tidak dihuraikan data. Ini membolehkan kami memanipulasi medan selepas menyahkarang JSON peringkat teratas.
Menyembunyikan Medan dengan Teg "-"
Untuk menyembunyikan medan "Nama Paparan" daripada penyahkodan automatik , kita boleh menggunakan tag "-" dalam definisi struct. Ini menghalang aplikasi daripada memberikan nilai pada medan itu semasa unmarshalling peringkat atas.
Menentukan Jenis Medan dan Mengisi
Setelah JSON peringkat atas dinyahkod, kami boleh memeriksa jenis medan RawDisplayName untuk menentukan sama ada ia adalah rentetan atau tatasusunan. Jika ia adalah rentetan, kami membongkarnya menjadi hirisan rentetan. Jika ia adalah tatasusunan, kami menggabungkan nilai dengan "&&" mengikut soalan asal.
Antara Muka Unmarshal Tersuai
Untuk senario dengan pelbagai medan yang berbeza-beza, ia boleh memberi manfaat untuk merangkum logik penghuraian dalam jenis tersuai yang melaksanakan antara muka json.Unmarshaler. Ini membolehkan kawalan terpusat ke atas proses penukaran data.
Contoh Pelaksanaan
Berikut ialah contoh pelaksanaan yang mengendalikan JSON yang ditentukan:
package main import ( "encoding/json" "fmt" "strings" ) type multiString string func (ms *multiString) UnmarshalJSON(data []byte) error { *ms = "" if len(data) > 0 { switch data[0] { case '"': var s string if err := json.Unmarshal(data, &s); err != nil { return err } *ms = multiString(s) case '[': var s []string if err := json.Unmarshal(data, &s); err != nil { return err } *ms = multiString(strings.Join(s, "&&")) } } return nil } type MyListItem struct { Date string `json:"date"` DisplayName multiString `json:"display_name"` } type MyListings struct { CLItems []MyListItem `json:"myitems"` } func main() { var listings MyListings err := json.Unmarshal([]byte(`{ "date": "30 Apr", "display_name": "Mr Smith" },{ "date": "30 Apr", "display_name": ["Mr Smith", "Mr Jones"] }`), &listings) if err != nil { fmt.Println(err) return } fmt.Println(listings) }
Dengan menggunakan teknik ini, kami boleh membongkar JSON secara berkesan dengan medan pelbagai jenis, memastikan aplikasi boleh mengendalikan data dengan betul.
Atas ialah kandungan terperinci Cara Mengendalikan Medan JSON yang Tidak Konsisten: Rentetan vs. Susunan Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!