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

springboot 专栏收录该内容
2 篇文章 0 订阅

使用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.使用下面的方法,先导入依赖

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
    <version>3.5.0</version>
</dependency>
  • 修改return代码
return  com.google.protobuf.util.JsonFormat.printer().includingDefaultValueFields().print(response);
  • 因为使用了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> 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> T json2pb(Object entity, Message.Builder builder) throws ParseException, InvalidProtocolBufferException {
		if (builder == null || entity == null) {
			return null;
		}
		return json2pb(JSON.toJSONString(entity), builder);
	}
	
}
  • 1
    点赞
  • 4
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值