将结构编组为 JSON 时,我可以将一个变量分配给它对应的“空值”,并且即使在使用 omitempty 时仍然传递它,但是我无法在嵌套结构中获得相同的结果,因为尽管它是一个指针。这可能吗?
type Foo struct {
Bar Bar `json:"bar,omitempty"`
A *int `json:"a,omitempty"` //Does not get omitted when a = 0
B *bool `json:"b,omitempty"` //Does not get omitted when b = false
}
type Bar struct {
X *int `json:"x,omitempty"` //Gets omitted when x = 0
Y *bool `json:"y,omitempty"` //Gets omitted when y = false
}
那是因为它们不为空..您将它们设置为 0/false。 0/false 并不意味着它们不存在,您通过为它们分配一个值来在内存中提供一个空间。
package main
import (
"encoding/json"
"fmt"
)
type Foo struct {
Bar Bar `json:"bar,omitempty"`
A *int `json:"a,omitempty"` //Does not get omitted when a = 0
B *bool `json:"b,omitempty"` //Does not get omitted when b = false
}
type Bar struct {
X *int `json:"x,omitempty"` //Gets omitted when x = 0
Y *bool `json:"y,omitempty"` //Gets omitted when y = false
}
func main() {
var obj Foo
a := 0 // a will not be not empty, it's set to 0
obj.A = &a
b, _ := json.MarshalIndent(obj, "", " ")
fmt.Println(string(b))
var obj2 Foo
// a and everything else will be empty, nothing is set
b, _ = json.MarshalIndent(obj2, "", " ")
fmt.Println(string(b))
}
来自文档
The "omitempty" option specifies that the field should be omitted from the encoding if the field has an empty value, defined as false, 0, a nil pointer, a nil interface value, and any empty array, slice, map, or string.
措辞可以更好,但在这种情况下为空意味着没有为该字段分配任何内容。这并不意味着如果该字段实际上设置为 0 或 false,它将为空。 False 和 0 也是值,如果您分配它们,则该字段将变为 0 或 false。
这是因为它们是指针。空指针只是 nil,如果你希望它忽略 0 值变量,你需要像这样编写结构:
type Foo struct {
Bar Bar `json:"bar,omitempty"`
A int `json:"a,omitempty"` //Will get omitted when a = 0
B bool `json:"b,omitempty"` //Will get omitted when b = false
}
如果你有这个: A *int,意思是如果A被赋值为0,它是一个指向值为0的整数的指针,因此它有内存分配。