在复杂的 JSON 编码场景中,可能会遇到应该省略的嵌套空结构也被编码的情况出于空间和效率的目的。例如,考虑以下代码片段:
type ColorGroup struct { ID int `json:",omitempty"` Name string Colors []string } type Total struct { A ColorGroup `json:",omitempty"` B string `json:",omitempty"` }
当 json.Marshal 用于具有空 A 字段的 Total 实例时,它仍然出现在输出 JSON 中:
group := Total{ A: ColorGroup{}, // An empty ColorGroup instance } json.Marshal(group) // Output: {"A":{"Name":"","Colors":null},"B":null}
期望的结果是完全省略 A 字段:
{"B":null}
解决这个问题的关键在于指针的使用。如果 Total 中的 A 字段声明为指针,则在未显式赋值时会自动设置为 nil,解决了空结构编码的问题:
type ColorGroup struct { ID int `json:",omitempty"` Name string Colors []string } type Total struct { A *ColorGroup `json:",omitempty"` // Using a pointer to ColorGroup B string `json:",omitempty"` }
经过此修改,json.Marshal 输出现在将正确省略空 A 字段:
group := Total{ B: "abc", // Assigning a value to the B field } json.Marshal(group) // Output: {"B":"abc"}
以上是如何在 Go 的 json.Marshal 中省略空嵌套结构?的详细内容。更多信息请关注PHP中文网其他相关文章!