如何使用数组或对象解组 JSON
处理 JSON 时,处理返回数据可能是数组或对象的场景对象可能具有挑战性。本文解决了这个问题,并提出了一个解决方案,涉及使用 json.RawMessage 类型和基于 JSON 结构的动态解组。
揭开动态 JSON 结构
考虑以下 JSON 响应:
{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"
{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1"
从响应中可以看出,gwrcmd可以是对象或数组。为了解决这个问题,自定义的 Go 结构体定义为:
type Response struct { Gwrcmds struct { Gwrcmd struct { Gcmd string Gdata struct { Gip struct { Version string
解决解组难题
解决这个问题的关键在于利用 json.RawMessage ,它接受任何 JSON 值。我们在 Response 结构中创建一个包装器来保存原始 JSON:
type Response struct { RawAWrapper struct { RawA json.RawMessage `json:"a"` }
基于 JSON 结构的动态解组
在 Response 结构的 UnmarshalJSON 方法中,我们检查 RawAWrapper.RawA 的第一个字节以确定它是否表示数组或对象。根据结果,我们相应地解组数据:
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.RawAWrapper); err != nil { return err } if r.RawAWrapper.RawA[0] == '[' { return json.Unmarshal(r.RawAWrapper.RawA, &r.As) } return json.Unmarshal(r.RawAWrapper.RawA, &r.A) }
这种方法可以灵活地处理具有不同结构的 JSON,而不需要多个结构。
以上是当数据可能是数组或对象时,如何处理 JSON 解组?的详细内容。更多信息请关注PHP中文网其他相关文章!