当字段可能不一致时,解组 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中文网其他相关文章!