回答

收藏

JSON 和处理未导出的字段

技术问答 技术问答 306 人阅读 | 0 人回复 | 2023-09-12

编码/json 不包括未导出的字段是否有技术原因?如果没有,这是任何决定。即使没有导出,是否还有其他后门选项(如 )可以包括在内?
" r* D8 D2 {9 s6 E, R不幸的是,需要导出客户端代码才能获得此功能,特别是如果小写字母提供包装或组装结构的决定比设计它们晚得多。9 A3 x& L, g& S6 B0 \$ o
人们如何处理这个问题?只是出口一切?! U8 A: m7 X3 N3 `
此外,不导出字段名称会使遵循建议的习语变得困难。我认为如果结构 X 有字段 Y,你不能有访问器方法Y()Y 接口访问,你必须是 getter 想出一个新名字,不管你得到什么,根据http://golang.org/doc/effective_go.html#Getters,你会得到一些不常用的东西
! k8 ~5 R: n7 Y& `                                                                " d. A2 F" t" h3 E2 c; S/ x
    解决方案:                                                                6 R% u( h# Y, n! X4 {% j
                                                                有技术原因。json 库无权使用反射来检查字段,除非它们被导出。一个包只能检查包中类型的未导出字段
9 ?: x( X4 {0 t7 x5 U为了解决你的问题,你所能做的就是用导出字段来制作未导出的类型。如果没有问题地传递给 Json,它将解组成未导出的类型,但不会出现在 API 文档。然后,您可以创建嵌入式未导出类型的导出类型。这种导出类型需要实现json.Marshaler和json.Unmarshaler接口。
" Q& q+ Z, N9 I0 r注意:所有代码都未经测试,甚至可能无法编译。, A. p+ s! l. ]' Y
    type jsonData struct    Field1 string    Field2 string}type JsonData struct    jsonData}// Implement json.Unmarshallerfunc (d *JsonData) UnmarshalJSON(b []byte) error    return json.Unmarshal(b,&d.jsonData)}// Getterfunc (d *JsonData) Field1() string    return d.jsonData.Field1}
    ! O7 b# P7 j% \! }
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则