處理不一致的JSON 欄位:字串與陣列的情況
處理不完全一致的JSON 資料時,可能會出現挑戰在解組過程中。當 JSON 中的特定欄位的格式發生變化,從而給解組過程帶來困難時,就會發生這種情況。
問題:
考慮以下場景:
type MyListItem struct { Date string `json:"date"` DisplayName string `json:"display_name"` } type MyListings struct { CLItems []MyListItem `json:"myitems"` }
JSON 資料有一個名為「display_name」的字段,該字段應為字符串。但是,在某些情況下,它也可以是字串陣列。這種不一致使解組過程變得複雜,從而導致錯誤。
解決方案:
為了克服這個挑戰,我們可以利用兩種技術:
已更新程式碼:
type MyListItem struct { Date string `json:"date"` RawDisplayName json.RawMessage `json:"display_name"` DisplayName []string `json:"-"` }
解組JSON:
解組頂上JSON
var li MyListItem if err := json.Unmarshal(data, &li); err != nil { // handle error }
提取「DisplayName」 “字段取決於其類型:
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, "&&") } }
示例:
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, "&&") } } }
透過採用這些技術,您可以有效地處理不一致的JSON 字段,確保應用程式中正確的資料擷取與操作.
以上是如何處理不一致的 JSON 欄位:字串與陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!