未调用MarshalJSON [英] MarshalJSON not called

查看:22
本文介绍了未调用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)

显然EditionsMapEditions结构的映射:

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()

Spec: Method sets:

一个类型可以有一个与其关联的方法集。Aninterface type的方法集是其接口。任何其他类型的方法集T由接收方类型T声明的所有methods组成。对应的pointer type*T的方法集是用接收方*TT声明的所有方法的集合(即还包含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上尝试此功能的工作示例。

另一个选项是使用值Receiver定义Edition.MarshalJSON()方法:

func (u Edition) MarshalJSON() ([]byte, error)
这样,无论是封送指针值还是非指针值,它都会起作用,因为带有值接收器的方法是Edition类型和相应的*Edition指针类型的方法集的一部分。在Go Playground上尝试此变体的工作示例。

这篇关于未调用MarshalJSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆