Protobuf是谷歌出品的一个数据协议框架,跟json相比,有独特的优点,这里不多说。
Protobuf3相比Protobuf2有很多改进。其中一个就any类型。有点类似java的泛型。也添加了Protobuf与json的互转,非常方便
如何转换json:
先添加jar支持,protobuf 转json的工具类在protobuf-java-util这个包中,通过maven引用进来
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.5.1</version>
</dependency>
使用:
// 创建一个消息
Message.Builder builder = Message.newBuilder();
//转换json
String msgJson = JsonFormat.printer().print(builder);
这里要说的一点就是,当Protobuf转json时,如果你的.proto文件里面有any类型。在转换json时可能会遇到这样一个报错
这是因为你的any类型里面,有protobuf不认识的类型,所以报无法识别。
参考谷歌的文档,有一段这样写:
当你在使用protobuf转json时,如果含有any类型,需要显性注册该类型到JsonFormat中。
看代码:
// 未知的类型转json。需要添加TypeRegistry
TypeRegistry typeRegistry = JsonFormat.TypeRegistry.newBuilder()
.add(AddFriendReq.getDescriptor()).build();
String msgJson = JsonFormat.printer()
.usingTypeRegistry(typeRegistry).print(builder);
注册类型以后,便可以正常转换成json了。