本文介绍了未调用MarshalJSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用以下界面自定义MarshalJSON
的输出:
func (m *RawMessage) MarshalJSON() ([]byte, error)
我遵循了该教程:http://choly.ca/post/go-json-marshalling/
我的目的是删除将其中一个字段替换为True/False(如果设置或未设置),因此我最终编写了该函数:
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
是Edition
s结构的映射:
var EditionsMap map[string]datamodel.Edition
问题是MarshalJSON
函数显然从未被调用过。
可能我做错了什么,但我不明白是什么问题,我的理解是我只需要实现该函数就可以调用它。
推荐答案
这是因为您使用指针接收方声明了Edition.MarshalJSON()
方法:
func (u *Edition) MarshalJSON() ([]byte, error)
并尝试封送非指针值(您的映射包含datamodel.Edition
值):
var EditionsMap map[string]datamodel.Edition
// ...
json.NewEncoder(w).Encode(EditionsMap)
带有指针接收器的方法不是相应非指针类型方法集的一部分。datamodel.Edition
类型的方法集不包含方法MarshalJSON()
。
尝试封送指针值,定义映射以包含指针:
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上尝试此功能的工作示例。
另一个选项是使用值Receiver定义Edition.MarshalJSON()
方法:
func (u Edition) MarshalJSON() ([]byte, error)
这样,无论是封送指针值还是非指针值,它都会起作用,因为带有值接收器的方法是Edition
类型和相应的*Edition
指针类型的方法集的一部分。在Go Playground上尝试此变体的工作示例。 这篇关于未调用MarshalJSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!