使用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);
}
}
推荐阅读
- 喂,你结婚我给你随了个红包
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- CET4听力微技能一
- 放下心中的偶像包袱吧
- 社保代缴公司服务费包含哪些
- iOS中的Block