用数组和字符串解组不一致的 JSON 字段
当数据不一致时,例如当字段可以字符串或字符串数组。为了处理这种情况,我们可以采用各种策略。
使用 RawMessage 捕获不同的数据
对于不同类型的字段,我们可以使用 json.RawMessage 来捕获未解析的数据数据。这允许我们在解组顶级 JSON 后操作该字段。
使用“-”标记隐藏字段
隐藏“DisplayName”字段以防止自动解码,我们可以在结构体定义中使用“-”标记。这可以防止应用程序在顶级解组期间为该字段分配值。
确定字段类型并填充
一旦顶级 JSON 被解码,我们可以检查 RawDisplayName 字段的类型以确定它是字符串还是数组。如果它是字符串,我们将其解组为字符串切片。如果它是一个数组,我们按照原始问题用“&&”连接值。
自定义解组接口
对于具有不同类型的多个字段的场景,它将解析逻辑封装在实现 json.Unmarshaler 接口的自定义类型中可能是有益的。这允许对数据转换过程进行集中控制。
示例实现
以下是处理指定 JSON 的示例实现:
package main import ( "encoding/json" "fmt" "strings" ) type multiString string func (ms *multiString) UnmarshalJSON(data []byte) error { *ms = "" if len(data) > 0 { switch data[0] { case '"': var s string if err := json.Unmarshal(data, &s); err != nil { return err } *ms = multiString(s) case '[': var s []string if err := json.Unmarshal(data, &s); err != nil { return err } *ms = multiString(strings.Join(s, "&&")) } } return nil } type MyListItem struct { Date string `json:"date"` DisplayName multiString `json:"display_name"` } type MyListings struct { CLItems []MyListItem `json:"myitems"` } func main() { var listings MyListings err := json.Unmarshal([]byte(`{ "date": "30 Apr", "display_name": "Mr Smith" },{ "date": "30 Apr", "display_name": ["Mr Smith", "Mr Jones"] }`), &listings) if err != nil { fmt.Println(err) return } fmt.Println(listings) }
通过使用这些技术,我们可以有效地对具有不同类型字段的 JSON 进行解组,确保应用程序可以正确处理数据。
以上是如何处理不一致的 JSON 字段:字符串与字符串数组?的详细内容。更多信息请关注PHP中文网其他相关文章!