Menyahmarshalling JSON boleh mencabar apabila medan boleh tidak konsisten, muncul sebagai sama ada rentetan atau tatasusunan rentetan. Ketidakkonsistenan ini boleh membawa kepada ralat unmarshalling, menyebabkan aplikasi anda gagal.
Gunakan Raw JSON Data Capture
Gunakan data json.RawMessage struktur untuk menangkap medan JSON yang berbeza-beza sebagai data mentah. Selain itu, manfaatkan tag nama json "-" untuk menyembunyikan medan semasa fasa penyahkodan awal.
type MyListItem struct { Date string `json:"date"` RawDisplayName json.RawMessage `json:"display_name"` DisplayName []string `json:"-"` }
Unmarshal Top-Level JSON
Nyahmarshal top- tahap struktur JSON tanpa mengisi DisplayName medan.
var li MyListItem if err := json.Unmarshal(data, &li); err != nil { // handle error }
Parse Raw Display Name
Bergantung pada jenis data mentah, nyahmarshall nama paparan ke dalam format yang sesuai.
if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } // Join arrays with "&&" li.DisplayName = strings.Join(s, "&&") } }
Kendalikan Tatasusunan Penyenaraian
Sepadukan logik yang disebut di atas ke dalam gelung untuk mengendalikan tatasusunan objek MyListItem dalam struktur MyListings.
var listings MyListings if err := json.Unmarshal([]byte(data), &listings); err != nil { // handle error } for i := range listings.CLItems { li := &listings.CLItems[i] // Parse raw display name if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } li.DisplayName = strings.Join(s, "&&") } } }
Encapsulate Logic
Untuk kejadian berulang medan dengan pelbagai jenis, pertimbangkan merangkum logik penghuraian dalam jenis tersuai yang melaksanakan json.Unmarshaler antara muka.
Kendalikan Nilai Tatasusunan
Untuk mengekalkan nilai medan sebagai kepingan rentetan dan bukannya rentetan bercantum, ubah suai jenis multiString dengan sewajarnya.
Teknik ini menyediakan kaedah yang mantap untuk mengendalikan medan JSON yang tidak konsisten, memastikan data unmarshalling berjaya dan tepat mendapatkan semula.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyahmarshal Inconsistent String atau Array Medan JSON dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!