回答

收藏

JSON 和处理未导出的字段

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

编码/json 不包括未导出的字段是否有技术原因?如果没有,这是任何决定。即使没有导出,是否还有其他后门选项(如 )可以包括在内?
+ k  P, @9 p1 n- `1 T; a不幸的是,需要导出客户端代码才能获得此功能,特别是如果小写字母提供包装或组装结构的决定比设计它们晚得多。: {* f8 y. ]/ ?. a# Q- y) I* z( \
人们如何处理这个问题?只是出口一切?
3 a* Y+ Z7 S0 q" Q# {/ y此外,不导出字段名称会使遵循建议的习语变得困难。我认为如果结构 X 有字段 Y,你不能有访问器方法Y()Y 接口访问,你必须是 getter 想出一个新名字,不管你得到什么,根据http://golang.org/doc/effective_go.html#Getters,你会得到一些不常用的东西
9 [) ?( l) \- _                                                                7 n2 ~7 g+ Z0 q" k! X/ v, d
    解决方案:                                                               
+ X  S% k! i$ B1 F. D2 ~  S- I                                                                有技术原因。json 库无权使用反射来检查字段,除非它们被导出。一个包只能检查包中类型的未导出字段0 Q4 \% D' |9 u# D, y" _& u
为了解决你的问题,你所能做的就是用导出字段来制作未导出的类型。如果没有问题地传递给 Json,它将解组成未导出的类型,但不会出现在 API 文档。然后,您可以创建嵌入式未导出类型的导出类型。这种导出类型需要实现json.Marshaler和json.Unmarshaler接口。' ~# p% C8 S2 B+ `* ]
注意:所有代码都未经测试,甚至可能无法编译。& ]% R' W& O, S8 [) P! R! a7 `
    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}  w+ G, t0 x# j0 \0 D& v: F2 b
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则