回答

收藏

JSON 和处理未导出的字段

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

编码/json 不包括未导出的字段是否有技术原因?如果没有,这是任何决定。即使没有导出,是否还有其他后门选项(如 )可以包括在内?
. I& Q. z# L1 c' q3 j8 y不幸的是,需要导出客户端代码才能获得此功能,特别是如果小写字母提供包装或组装结构的决定比设计它们晚得多。
! N9 r7 ~- w& z2 Y) X2 E! e人们如何处理这个问题?只是出口一切?
$ h; t8 J4 |2 S此外,不导出字段名称会使遵循建议的习语变得困难。我认为如果结构 X 有字段 Y,你不能有访问器方法Y()Y 接口访问,你必须是 getter 想出一个新名字,不管你得到什么,根据http://golang.org/doc/effective_go.html#Getters,你会得到一些不常用的东西# l& s  o( c+ ~) b
                                                                ; u2 M" E& Z* ]4 x) t+ Y9 p5 |0 U1 Q2 Y
    解决方案:                                                                  o2 T* x' s  z5 }1 O. g, e1 l
                                                                有技术原因。json 库无权使用反射来检查字段,除非它们被导出。一个包只能检查包中类型的未导出字段  x6 d7 q! o* Q2 u7 S3 @$ q9 P4 i
为了解决你的问题,你所能做的就是用导出字段来制作未导出的类型。如果没有问题地传递给 Json,它将解组成未导出的类型,但不会出现在 API 文档。然后,您可以创建嵌入式未导出类型的导出类型。这种导出类型需要实现json.Marshaler和json.Unmarshaler接口。
# E% m' H; g! }2 }注意:所有代码都未经测试,甚至可能无法编译。  T- v$ g1 U. g+ h
    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}# z" c! a/ H1 S( P0 @$ A) u
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则