json - 为什么编码 JSON 结构成员不调用自定义 MarshalJSON?

标签 json go

在 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/

相关文章:

javascript - 无限循环将 Ajax 数据附加到 div

php - Android Studio 尝试使用 volley 向 php 发送数据并检索 json 数组时出现错误

java - 让 Jackson 将单个 JSON 对象解释为包含一个元素的数组

docker - golang 程序在 docker 之外运行良好,但在 dockerized 时以 0 退出

ubuntu - Selenium 无法启动 - Ubuntu 14

具有微服务间数据传输的 Go-kit 真实世界示例

go - 如何使用多种格式在循环中解析日期?

php - 将 JSON 解码保存到 MySQL、PHP

javascript - 无法获得正确的 JSON 格式,相反我搞砸了

reflection - 在 Go 中,reflect.Interface 是哪种值?