如何用Protobuf3编码特定结构映射列表?需创建.proto文件
解决Proto3表示固定结构对象列表的问题
别担心,你之前的困惑是把“映射列表”误解成了Proto里的map类型,但其实你的数据是固定结构的对象组成的列表,完全不需要用map,用自定义消息类型加repeated字段就能完美解决。
具体实现思路
定义单个比赛数据的消息类型
把你每个JSON对象里的字段对应成Proto3的消息字段,遵循Proto3的语法规则:- Proto3已移除
required关键字,业务层面的必填校验需要在代码逻辑里自行处理 - 给每个字段分配唯一的编号(这个编号用于序列化/反序列化,一旦确定不要随意修改)
- 类型对应:字符串用
string,整数用int32(你的Season值如201617,int32完全可以容纳)
- Proto3已移除
定义包含列表的顶层消息
用repeated关键字标记字段,用来表示对象列表,对应你提供的JSON数组结构。
完整的.proto文件示例
syntax = "proto3"; // 单个比赛的详细数据结构 message Match { string AwayTeam = 1; string Date = 2; string Div = 3; int32 FTAG = 4; int32 FTHG = 5; string FTR = 6; int32 HTAG = 7; int32 HTHG = 8; string HTR = 9; string HomeTeam = 10; int32 Season = 11; } // 比赛列表,对应你提供的JSON数组 message MatchList { repeated Match matches = 1; }
为什么不用map?
你之前查阅的map类型是用来表示键值对集合(比如Python的dict、Java的HashMap),但你的每个元素都是有明确字段名和类型的固定结构对象,用自定义message类型才是最贴合的方案,既清晰又符合Proto的设计思路。
使用小提示
生成对应语言的代码后,你只需要创建MatchList对象,把一个个Match实例添加到它的matches列表中,就能完成和你提供的JSON数组完全等价的数据序列化操作。
内容的提问来源于stack exchange,提问作者Flame_Phoenix
相关产品推荐
相关产品推荐

