Mengendalikan Medan JSON yang Tidak Konsisten: Kes Rentetan vs. Tatasusunan
Apabila berurusan dengan data JSON yang tidak konsisten sepenuhnya, cabaran mungkin timbul dalam proses unmarshalling. Ini boleh berlaku apabila medan tertentu dalam JSON berbeza dalam formatnya, menimbulkan kesukaran untuk proses unmarshalling.
Masalahnya:
Pertimbangkan senario berikut:
type MyListItem struct { Date string `json:"date"` DisplayName string `json:"display_name"` } type MyListings struct { CLItems []MyListItem `json:"myitems"` }
Data JSON mempunyai medan yang dipanggil "display_name", yang dijangkakan sebagai rentetan. Walau bagaimanapun, dalam beberapa kes, ia juga boleh menjadi tatasusunan rentetan. Ketidakkonsistenan ini merumitkan proses unmarshalling, yang membawa kepada ralat.
Penyelesaian:
Untuk mengatasi cabaran ini, kita boleh memanfaatkan dua teknik:
Dikemas kini Kod:
type MyListItem struct { Date string `json:"date"` RawDisplayName json.RawMessage `json:"display_name"` DisplayName []string `json:"-"` }
Menyahmarshall JSON:
Menyahmarshall JSON peringkat atas:
var li MyListItem if err := json.Unmarshal(data, &li); err != nil { // handle error }
Mengekstrak "DisplayName " medan bergantung padanya jenis:
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, "&&") } }
Contoh:
var listings MyListings if err := json.Unmarshal([]byte(data), &listings); err != nil { // handle error } for i := range listings.CLItems { li := &listings.CLItems[i] 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, "&&") } } }
Dengan menggunakan teknik ini, anda boleh mengendalikan medan JSON yang tidak konsisten dengan berkesan, memastikan pengekstrakan dan manipulasi data yang betul dalam aplikasi anda .
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Medan JSON yang Tidak Konsisten: Rentetan vs. Tatasusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!