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