Protobuf 与 JSON转换
·
解决 Protobuf 转 JSON 字段名异常问题
问题分析
直接使用 FastJson 转换 Protobuf 对象时,会暴露内部字段(如 ****OrBuilder)并修改 List 类型字段名(如 partnerList 变为 partnerListList)。这不符合仅输出 Protobuf 定义字段的需求。
推荐解决方案:使用 Protobuf 原生 JsonFormat
方法实现
通过 com.google.protobuf.util.JsonFormat 工具类,可精确控制 JSON 输出格式,避免字段名修改和隐藏字段泄露:
import com.google.protobuf.util.JsonFormat;
// 创建 Printer 并配置保留原始字段名
JsonFormat.Printer printer = JsonFormat.printer().preservingProtoFieldNames();
// 转换 Protobuf 对象为 JSON 字符串
CorporationPaymentConfigAddV3Cmd cmd = ...; // Protobuf 对象实例
String jsonStr = printer.print(cmd);
System.out.println(jsonStr);
关键配置说明
preservingProtoFieldNames(): 禁止字段名修改,确保 List 类型字段名不变(如partnerList不会变为partnerListList)。- 原生工具会过滤 Protobuf 内部字段(如
OrBuilder相关字段),仅输出定义的字段。
扩展配置选项(可选)
忽略未知字段
若需忽略未定义的字段,可添加配置:
JsonFormat.Printer printer = JsonFormat.printer()
.preservingProtoFieldNames()
.includingDefaultValueFields(); // 包含默认值字段(按需选择)
格式化输出
如需美化 JSON 输出:
String jsonStr = printer.print(cmd); // 紧凑格式
String prettyJsonStr = printer.omittingInsignificantWhitespace().print(cmd); // 格式化缩进
对比方案优劣
| 方案 | 优点 | 缺点 |
|---|---|---|
| Protobuf JsonFormat | 字段名精准控制,无隐藏字段 | 需引入 Protobuf 工具库 |
| FastJson | 无需额外依赖 | 字段名和结构可能被意外修改 |
结论
对字段名和结构有严格要求的场景,优先使用 Protobuf 原生工具类。
更多推荐



所有评论(0)