json转化为proto
json->proto
1. json转换为proto的问题
需求是这样的,传入的文件格式是json,需要将json转换为proto再进行操作,原因是,改代码的时候只需要改proto就行了(这块没听懂,照着做就完了)。使用的时候却遇到了很大问题,首先json和proto要怎么对应呢?我就按照自己的想法一通写proto,结果发现python一直在报错,完了我就怀疑是proto和json的格式不对应,就贼难受。后来我才发现,有很多网站本身就可以实现json转换为proto的需求,真是又高兴又气。https://json-to-proto.github.io/
不过我在按照网站上的proto搞定后,发现有的时候能用,有的时候python继续报错。问了很多人都不知道怎么办,在凯新大帝的提醒下才发现,json最外层的类型可以是list、可以是{}都可以的,但是proto却要求所有的内容都要包在message内部,也就是说虽然proto也支持repeated这种list,但是最外层必须是对象才行,我就把json的外层用dict封装了一下,即json的结构是dict,key是一个我给的字符串,value是之前的list。虽然这样和改之前对应的proto是相同的,但是这时候python就能过了,不愧是大帝啊。
2. 遍历proto内的全部元素
这个需求很奇怪,proto大概长成这样
message
{
optional string a = 1;
optional string b = 2;
};
我要遍历a和b还有可能会有的cdefg啥的,听起来这个需求是不是就很奇怪,类似于遍历结构体内的全部元素,这啥玩意。还就真让我找到办法了,不过这种方法并不准确。我用getattr()获取了这个proto的全部成员,但是这里面有很多是proto自带的,类似于库函数那种,我咋分开呢?这时候就用type().__name__ == `RepeatedCompositeContainer'来筛选出名字符合的变量名,但是这种筛选方式很不准,后续如果改了proto,不确定代码会不会就不能用了。此外,整个过程需要用try-catch包裹一下,因为如果type不对的话会报错误,此时跳过就行了。下面是伪代码
for a in dir(proto):
try:
b = getattr(proto, a)
if type(b).__name__ == 'RepeatedCompositeContainer':
#lalala
except AttributeError:
continue
这种方法并不好,其实完全可以修改proto的格式,将proto内容的a、b啥的合并成一个list,如果合并不了,就没招了。。。。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)