一尘不染

JSON 和处理未导出的字段

go

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

需要导出客户端代码才能获得此功能感觉很不幸,特别是如果小写字母提供封装或编组结构的决定比设计它们要晚得多。

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

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


阅读 141

收藏
2021-12-15

共1个答案

一尘不染

有技术原因。json 库无权使用反射查看字段,除非它们被导出。一个包只能查看自己包内类型的未导出字段

为了解决您的问题,您可以做的是使用导出字段制作未导出的类型。如果没有问题地传递给 Json,它将解组为未导出的类型,但它不会出现在 API 文档中。然后,您可以创建嵌入未导出类型的导出类型。这个导出的类型需要方法来实现json.Marshalerjson.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
}
2021-12-15