Protobuf中bytes字段转JSON时是否会被转换为Base64?
Protobuf bytes字段转JSON时是否会被Base64编码?
问题背景
你提到在将Protobuf Message转换为JSON时,不确定bytes类型的字段是否会被转成Base64编码,同时给出了你的proto定义和转换代码:
你的Proto文件
syntax = "proto2"; package user; message user_message { required bytes username = 1; optional string phonenum = 2; optional string password = 3; }
你的转换代码
base_msg = msg_periodic_pb2.m_apps_message() base_msg.ParseFromString(message) base_msg = json_format.MessageToJson(base_msg)
回答
Short answer: Yes,你的username这个bytes字段在转换为JSON时,默认会被编码成Base64字符串。
这是因为JSON本身并没有原生支持二进制数据类型,而Protobuf的官方JSON映射规范(你使用的json_format工具正是遵循这个规范)明确规定:bytes类型的字段需要被序列化为Base64编码的字符串。这样做既能保证二进制数据的完整性,又能完全符合JSON的格式要求。
举个实际例子,如果你的username字段原始字节是b"john_doe",转换后的JSON里对应的字段值会是"am9obl9kb2U="——这就是b"john_doe"的Base64编码结果。
如果你的需求是避免Base64编码(虽然JSON本身不支持原始二进制存储,但也许你有特殊业务场景),需要注意:json_format.MessageToJson并没有直接关闭这个转换的选项,因为这是遵循规范的默认行为。不过你可以在转换前手动提取bytes字段的原始值,做自定义处理后再写入JSON结构。
内容的提问来源于stack exchange,提问作者swateek
相关产品推荐
相关产品推荐

