使用protobuf-java-format包|使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题

使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题
1.产生的bug

XXXXXXXXRequest.Builder request = XXXXXXXXRequest.newBuilder(); XXXXXXResponse response = XXXXXXResponse.newBuilder().build(); JsonFormat format = new JsonFormat(); return format.printToString(response);

使用这个方法会导致 字段值是默认值的数据忽略,返回的结果缺少自己想要的值
2.解决办法 1.如果你的项目中允许 使用其他的工具 比如阿里fastjson
2.使用下面的方法,先导入依赖
com.google.protobuf protobuf-java-util 3.5.0

  • 修改return代码
returncom.google.protobuf.util.JsonFormat.printer().includingDefaultValueFields().print(response);

  • 【使用protobuf-java-format包|使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题】因为使用了includingDefaultValueFields方法,所以会把所有的字段都输出,完美解决此问题!
  • 注:使用此方法需要抛出异常,你的response对象不存在的字段时会报InvalidProtocolBufferException,此时需要使用ignoringUnknownFields
  • XXXXXProto.Builder builder = XXXXXProto.newBuilder(); Stirng json = data; //你的json数据 JsonFormat.parser().ignoringUnknownFields().merge(json, builder);

附工具类
import com.alibaba.fastjson.JSON; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.Message; import com.google.protobuf.TextFormat.ParseException; import com.google.protobuf.util.JsonFormat; public class ProtobufUtils { /** * json数据转换为pb对象 */ @SuppressWarnings("unchecked") public static T json2pb(String json, Message.Builder builder) throws ParseException, InvalidProtocolBufferException { if (builder == null) { return null; } JsonFormat.parser().ignoringUnknownFields().merge(json, builder); return (T) builder.build(); } /** * json数据转换为pb对象 */ public static T json2pb(Object entity, Message.Builder builder) throws ParseException, InvalidProtocolBufferException { if (builder == null || entity == null) { return null; } return json2pb(JSON.toJSONString(entity), builder); } }

    推荐阅读