使用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);
} }

使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题的更多相关文章

  1. (转载)JAVA中八种基本数据类型的默认值

    原文链接: http://simon-c.iteye.com/blog/1016031 引用 For type byte, the default value is zero, that is, th ...

  2. java各种数据类型的数组元素的默认值

    public class DataTypeDefaultValue { public static void main(String[] args) { // string类型数组的默认值null / ...

  3. java零碎知识(每种数据类型默认值,多大,取值范围)

    只要记下字节就好了 其它不必死记,取值范围:没有正负的,2的 字节数*8次方-1  , 凡是有正负的2的 (字节数*8)-1次方 -1 比如: 1.byte(有正负):先计算是2的几次方:字节数1*( ...

  4. json:JSONObject包的具体使用(JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包)

    1.JSONObject介绍 JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包. 2.下载jar包 http:// ...

  5. Java下利用Jackson进行JSON解析和序列化

    Java下利用Jackson进行JSON解析和序列化   Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...

  6. Java入门系列:处理Json格式数据

    本节主要讲解: 1)json格式数据处理方法 2)第三方工具包的使用方法 3)java集合数据类型 [项目任务] 编写一个程序,显示未来的天气信息. [知识点解析] 为了方便后面代码的分析,先需要掌握 ...

  7. protobuf java学习

    本文档为java编程人员使用protocol buffer提供了一个基本的介绍,通过一个简单的例程进行介绍.通过本文,你可以了解到如下信息: 1.在一个.proto文件中定义一个信息格式. 2.使用p ...

  8. java jar包收集

    activation~与javaMail有关的jar包,使用javaMail时应与mail.jar (mail.jar和activation.jar)一起加入到lib中去,具体负责mail的数据源和类 ...

  9. 使用JSONObject遇到的问题,java.lang.NoClassDefFoundError: net/sf/json/JSONObject

    先是报 java.lang.NoClassDefFoundError: net/sf/json/JSONObject 这个错误, 打开项目属性找到java build path中的libaries,找 ...

随机推荐

  1. 初学python-day3 列表

  2. Golang通脉之接口

    接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节. 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型. interface是 ...

  3. 安装pytorch的细节记录

    1.根据教程安装pytorch的时候发现太慢了,无法容忍,根据https://blog.csdn.net/zzq060143/article/details/88042075z在Ancona Prom ...

  4. RGB-YUV

    1,RGB 1.1 RGB说明 RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通 ...

  5. OpenWrt编译问题记录

    错误一.config.status: error: cannot find input file: `xmetadataretriever/Makefile.in' configure: creati ...

  6. JAVA笔记 **__Netbeans常用快捷键

    sout + Tab      生成输出语句 alt+shift+F 格式化代码 Alt+insert  插入代码(包括构造函数,setter和getter方法等) Ctrl+O或Ctrlt+单击 转 ...

  7. popStar机机对战数据生成器代码(C#)

    代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  8. Java实体映射工具MapStruct使用详解

    1.序 通常在后端开发中经常不直接返回实体Entity类,经过处理转换返回前端,前端提交过来的对象也需要经过转换Entity实体才做存储:通常使用的BeanUtils.copyProperties方法 ...

  9. Spark记录(二):Spark程序的生命周期

    本文以Spark执行模式中最常见的集群模式为例,详细的描述一下Spark程序的生命周期(YARN作为集群管理器). 1.集群节点初始化 集群刚初始化的时候,或者之前的Spark任务完成之后,此时集群中 ...

  10. JMeter源码导入到Intellij IDEA (八)

    亲测:jmeter源码导入Intellij IDEA,导入,编译,运行! 一.环境:windows10操作系统,jdk1.8,Intellij IDEA 2018.3,jmeter5.0 下载jmet ...