处理不一致的 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中文网其他相关文章!