解决 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 原生工具类。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐