在 Golang 中,我有一个结构体,其成员是具有常量值的自定义 int 类型。基本上,自定义类型是一个逻辑枚举。
type Flavor int
const (
Vanilla Flavor = iota
Chocolate
Strawberry
)
func (f *Flavor) MarshalJSON() ([]byte, error) {
return []byte(strconv.Quote(f.String())), nil
}
自定义类型定义了 MarshalJSON 和 UnmarshalJSON 函数,因此当我将自定义类型序列化为 JSON 时,我希望在序列化输出中获得值的 string,而不是 int 值。
我的问题是,如果我有一个指向包含类型的指针,则包含类型会使用自定义函数进行编码,但如果尝试仅使用结构值进行编码,则 JSON 包不会调用自定义 MarshalJSON
type Dessert struct {
Flavor Flavor `json:"flavor"`
Count int
}
....
d := Dessert{Strawberry, 13}
b, err = json.Marshal(d) // !! does not invoke members Marshal !!
b, err = json.Marshal(&d) // works as expected
....
产生
{"flavor":2,"Count":13}
{"flavor":"Strawberry","Count":13}
在这两种情况下,我都希望得到第二个输出。
为什么传递一个结构值不会在成员上调用 MarshalJSON 但它确实编码否则正确的 JSON?
参见 https://play.golang.org/p/mOl1GHhgynf 完整的工作代码
最佳答案
在您的代码中,Flavor
没有方法 MarshalJSON 因为您仅为 *Flavor
定义了方法。
如果您希望 type Flavor
拥有 MarshalJSON 方法,您必须在 Flavor
而不是 *Flavor
上定义它。
关于json - 为什么编码 JSON 结构成员不调用自定义 MarshalJSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52722555/