为了账号安全,请及时绑定邮箱和手机立即绑定

MarshalJSON 未调用

MarshalJSON 未调用

Go
牛魔王的故事 2022-03-03 16:31:51
我正在尝试MarshalJSON使用界面自定义 的输出:func (m *RawMessage) MarshalJSON() ([]byte, error)我按照那个教程:http ://choly.ca/post/go-json-marshalling/我的目的是删除用真/假(如果设置与否)替换其中一个字段,所以我最终编写了该函数:func (u *Edition) MarshalJSON() ([]byte, error) {    var vaultValue bool    vaultValue = true    var onlineValue bool    vaultValue = false    fmt.Println("here")    if u.Vault == nil {        vaultValue = false    }    if u.Online == nil {        onlineValue = false    }    type AliasEdition Edition    return json.Marshal(&struct {        Vault  bool `json:"vault,omitempty"`        Online bool `json:"online,omitempty"`        *AliasEdition    }{        Vault:        vaultValue,        Online:       onlineValue,        AliasEdition: (*Alias)(u),    })}JSON 是使用以下指令从地图创建的:json.NewEncoder(w).Encode(EditionsMap)显然EditionsMap是Editions 结构的 Map:var EditionsMap map[string]datamodel.Edition问题是该MarshalJSON函数显然从未被调用过。可能我做错了什么,但我不明白问题出在哪里,我的理解是我只需要实现那个函数就可以调用它。
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

这是因为您使用指针Edition.MarshalJSON()接收器声明了该方法:


func (u *Edition) MarshalJSON() ([]byte, error)

并且您尝试编组非指针值(您的地图包含datamodel.Edition值):


var EditionsMap map[string]datamodel.Edition

// ...

json.NewEncoder(w).Encode(EditionsMap)

具有指针接收器的方法不属于相应非指针类型的方法集。类型的方法集datamodel.Edition 不包含方法MarshalJSON()。


规格:方法集:


一个类型可能有一个与之关联的方法集。接口类型的方法集就是它的接口。任何其他类型的方法集由声明为接收者类型T的所有方法T组成。对应指针类型 *T的方法集是所有用receiver *Tor声明的方法的T集合(即它还包含 的方法集T)。


尝试编组指针值,定义您的地图以包含指针:


var EditionsMap map[string]*datamodel.Edition

// ...

if err := json.NewEncoder(w).Encode(EditionsMap); err != nil {

    panic(err) // HANDLE error somehow, do not omit it like in your example!

}

指针类型的值*Edition 确实有一个方法,该方法MarshalJSON()将被json包正确调用。在Go Playground上尝试一个可行的示例。


另一种选择是Edition.MarshalJSON()使用值接收器定义方法:


func (u Edition) MarshalJSON() ([]byte, error)

这样,无论您编组指针值还是非指针值,它都可以工作,因为具有值接收器的方法是Edition类型和相应*Edition指针类型的方法集的一部分。在Go Playground上尝试这个变体的工作示例。


查看完整回答
反对 回复 2022-03-03
  • 1 回答
  • 0 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号