小编典典

JSON和处理未导出的字段

go

是否存在技术原因,为什么编码/ json不包含未导出的字段?如果不是这样,这是一个任意决定,即使未导出,是否还会有其他后门选项(例如“ +”)包括在内?

要求导出客户端代码来获得此功能感到很不幸,尤其是在小写形式提供封装或封送结构的决定比其设计晚得多的情况下。

人们如何处理这个问题?只是出口一切?

另外,不导出字段名称会使遵循建议的惯用法变得困难。我认为,如果结构X具有字段Y,则不能具有访问器方法Y()。如果要提供对Y的接口访问权限,则必须为getter命名一个新名称,根据http://golang.org/doc/effective_go.html#Getters,无论您得到什么,都是不习惯的


阅读 329

收藏
2020-07-02

共1个答案

小编典典

有技术原因。除非已导出,否则json库无权使用反射查看字段。包只能查看其自己包中类型的未导出字段

为了解决您的问题,您可以做的是使用导出的字段创建未导出的类型。如果将Json毫无问题地传递给未导出的类型,它将解组,但是它不会显示在API文档中。然后,您可以创建嵌入未导出类型的导出类型。然后,此导出的类型将需要方法来实现json.Marshalerand
json.Unmarshaler接口。

注意:所有代码未经测试,甚至可能无法编译。

type jsonData struct {
    Field1 string
    Field2 string
}

type JsonData struct {
    jsonData
}

// Implement json.Unmarshaller
func (d *JsonData) UnmarshalJSON(b []byte) error {
    return json.Unmarshal(b, &d.jsonData)
}

// Getter
func (d *JsonData) Field1() string {
    return d.jsonData.Field1
}
2020-07-02