使用Protobuf的JsonFormat转JSON字符串时如何保留反斜杠?
解决gRPC Protobuf JsonFormat转JSON后bytes字段Base64解码问题
你的hash字段在Proto定义中应该是bytes类型,Protobuf的JsonFormat规范默认会将bytes类型序列化为Base64编码的字符串,这就是你看到转换结果的原因。要恢复原始的二进制转义格式,只需对Base64字符串做反向解码,再转成对应的转义字符串即可。
具体实现示例
Java 示例
import java.util.Base64; public class HashDecoder { public static void main(String[] args) { // JsonFormat输出的Base64字符串 String base64Hash = "dg5/6Id5lXdN3V0xKFq2xf4XyF920Q5RC9oYw14afP0="; // 解码成原始字节数组 byte[] originalBytes = Base64.getDecoder().decode(base64Hash); // 生成与原始格式一致的八进制转义字符串 StringBuilder escapedStr = new StringBuilder(); for (byte b : originalBytes) { int value = b & 0xFF; if (value < 32 || value > 126) { escapedStr.append(String.format("\\%03o", value)); } else { escapedStr.append((char) value); } } System.out.println(escapedStr.toString()); // 输出结果:v\016\177\350\207y\225wM\335]1(Z\266\305\376\027\310_v\321\016Q\v\332\030\303^\032|\375 } }
Python 示例
import base64 base64_hash = "dg5/6Id5lXdN3V0xKFq2xf4XyF920Q5RC9oYw14afP0=" # 解码原始字节 original_bytes = base64.b64decode(base64_hash) # 生成八进制转义字符串 escaped_str = "" for b in original_bytes: if 32 <= b <= 126: escaped_str += chr(b) else: # 转成3位的八进制转义格式 escaped_str += f"\\{oct(b)[2:].zfill(3)}" print(escaped_str) # 输出结果:v\016\177\350\207y\225wM\335]1(Z\266\305\376\027\310_v\321\016Q\v\332\030\303^\032|\375
额外说明
如果希望在JsonFormat序列化时直接输出原始转义格式而非Base64,需要自定义序列化逻辑——因为Protobuf官方的JsonFormat严格遵循规范,bytes类型默认就是Base64编码。相比自定义序列化,直接对Base64结果解码是更简单可靠的方案。
内容的提问来源于stack exchange,提问作者PaperFrog
相关产品推荐
相关产品推荐

