在 Go 中解码具有可变结构的 JSON 数据
在处理来自第三方来源的 JSON 数据时,遇到以下情况并不少见:数据的结构可能会有所不同。这对使用结构将 JSON 解组为特定数据类型的 Go 程序提出了挑战。
考虑 JSON 响应可能包含特定属性中的单个元素或数组的情况,例如“gwrcmd”在这个例子中。如果“gwrcmd”始终是单个元素,则像下面这样的结构是合适的:
type Response struct { Gwrcmds struct { Gwrcmd struct { Gcmd string Gdata struct { Gip struct { Version string } } } } }
但是,如果“gwrcmd”有时是一个数组,我们将在解组过程中遇到错误。
使用 json.RawMessage 实现灵活性
常见方法处理可变结构 JSON 数据的方法是使用 json.RawMessage,它允许我们捕获任意 JSON 值,而无需指定特定类型。一旦我们有了原始值,我们就可以检查它并决定如何进一步解组它。
type Response struct { Gwrcmds struct { Gwrcmd json.RawMessage } }
在 Response 结构的 UnmarshalJSON 方法中,我们可以检查 Gwrcmd 的内容并将其解组到适当的位置。类型:
func (r *Response) UnmarshalJSON(b []byte) error { if err := json.Unmarshal(b, &r.Gwrcmds); err != nil { return err } if r.Gwrcmds.Gwrcmd[0] == '[' { return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsArray) } return json.Unmarshal(r.Gwrcmds.Gwrcmd, &r.Gwrcmds.GwrcmdAsSingle) }
在这种情况下,我们通过为数组和单元素场景创建单独的字段来处理它们,基于原始值的内容进行解组。
替代方法
虽然 json.RawMessage 提供了灵活性,但它需要手动处理数据结构,并且可能不适合在所有情况下。替代方法包括:
最佳方法取决于应用程序的具体要求和 JSON 数据的复杂性。
以上是如何在 Go 中高效处理可变 JSON 结构?的详细内容。更多信息请关注PHP中文网其他相关文章!