當欄位可能不一致時,解組JSON 可能會很困難,顯示為字串或字串陣列。這種不一致可能會導致解組錯誤,從而導致您的應用程式失敗。
使用原始 JSON 資料捕獲
利用 json.RawMessage 資料結構來捕獲原始變化的 JSON 欄位作為原始資料。此外,利用 json“-”名稱標籤在初始解碼階段隱藏該欄位。
type MyListItem struct { Date string `json:"date"` RawDisplayName json.RawMessage `json:"display_name"` DisplayName []string `json:"-"` }
解組頂層 JSON
解組頂層 -等級 JSON 結構,無需填入 DisplayName 欄位。
var li MyListItem if err := json.Unmarshal(data, &li); err != nil { // handle error }
解析原始顯示名稱
根據原始資料的類型,將顯示名稱解組為適當的格式。
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, "&&") } }
處理列表數組
將上述邏輯整合到循環中以處理 MyListings 中的 MyListItem物件數組
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, "&&") } } }
封裝邏輯
對於重複出現不同類型的字段,可以考慮將解析邏輯封裝在實現 json.Unmarshaler介面的自訂類型中.
句柄數組值
要將欄位值保留為字串切片而不是連接字串,請相應地修改 multiString 類型。
這些技術提供了處理不一致 JSON 欄位的強大方法,確保成功的解組和準確的資料檢索。
以上是如何有效解組不一致的字串或陣列 JSON 欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!