回答

收藏

JSON 和处理未导出的字段

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

编码/json 不包括未导出的字段是否有技术原因?如果没有,这是任何决定。即使没有导出,是否还有其他后门选项(如 )可以包括在内?
; z9 V" B: q6 g: b2 ?5 O不幸的是,需要导出客户端代码才能获得此功能,特别是如果小写字母提供包装或组装结构的决定比设计它们晚得多。& z. g2 i1 m% S. a* T
人们如何处理这个问题?只是出口一切?9 D3 A- v8 C( O$ z
此外,不导出字段名称会使遵循建议的习语变得困难。我认为如果结构 X 有字段 Y,你不能有访问器方法Y()Y 接口访问,你必须是 getter 想出一个新名字,不管你得到什么,根据http://golang.org/doc/effective_go.html#Getters,你会得到一些不常用的东西7 B) }2 }' a) t8 n( Q, S5 u( n
                                                               
0 u1 |2 \& a4 E) P2 {; |    解决方案:                                                               
$ ^; O% u3 ]) C; L8 s                                                                有技术原因。json 库无权使用反射来检查字段,除非它们被导出。一个包只能检查包中类型的未导出字段* l9 Z6 v6 \8 ~. ?# {8 g  k  Z
为了解决你的问题,你所能做的就是用导出字段来制作未导出的类型。如果没有问题地传递给 Json,它将解组成未导出的类型,但不会出现在 API 文档。然后,您可以创建嵌入式未导出类型的导出类型。这种导出类型需要实现json.Marshaler和json.Unmarshaler接口。( R% R8 O7 p  @
注意:所有代码都未经测试,甚至可能无法编译。) _0 `! [  K1 L$ B! T! W- G
    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}/ m" h4 `; L, @- @" ^$ P0 n
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则