如何用脚本自动转化,一个protobuf文件到json格式

时间:2022-07-22
本文章向大家介绍如何用脚本自动转化,一个protobuf文件到json格式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、工作场景:

通常在公司的后台服务架构上,有很多进程服务,这些进程服务RPC又经常用谷歌的protobuf格式沟通。

但是工作上我又碰到了另一个使用场景:业务上线了一些h5活动页面,这些活动页面发请求都是用http+json格式传输。

所以我需要高速前端h5,,接口的json定义是什么样子的。

那么如果把proto类型文件转成json文件给前端呢,当然可以手写,但是这不是程序员该做的事,能用机器脚本做的就不应该用手动去做。

二、转化脚本

这里有个工程:https://github.com/boatingfisher/protobuf-json

我们先把他下载下来:git clone https://github.com/boatingfisher/protobuf-json

protobuf_json_writer.py 这就是我们的转化脚本的主角。提供了一个proto2json方法。这个方法把一个pb的python对象转化成json。

三、使用示例

3.1 环境准备

安装pip 的protobuf库,注意的是因为转化脚本是基于python2开发的,所以这里需要注意pip是使用python2的那个pip,而不是pip3。使用了--upgrade确保下载了最新的protobuf。

pip uninstall protobuf python3-protobuf

pip install --upgrade pip

pip install --upgrade protobuf

安装完查看protobuf版本

然后你的linux还需要安装protoc命令,

最新的二进制包在这里下载到,https://github.com/protocolbuffers/protobuf/releases

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.12.4/protoc-3.12.4-linux-x86_64.zip

然后解压zip包

unzip protoc-3.12.4-linux-x86_64.zip -d protoc-3.12.4

里面的bin目录有个二进制

拷贝到/usr/local/bin

cp protoc-3.12.4/bin/protoc /usr/local/bin/

查看安装的版本号:

3.1.1 注意版本号

这里要确保的是pip安装的protobuf版本号要高于protoc的版本号。

要不然可能会出现这个错误:

How to solve “AttributeError: module 'google.protobuf.descriptor' has no attribute '_internal_create_key”?

3.2 生成proto 的python类

protoc --proto_path=src/ --python_out=build/gen src/test.proto

  • --proto_path指定了src/test.proto所在的源目录(因为这里proto可以import互相包含,所以需包含可能import的基proto的源目录)
  • --python_out指定了生成目录
  • src/test.proto需要根据proto生成的文件

然后test.proto会生成一个test_pb2.py文件

3.3 修改输出脚本

首先我们有个protoc文件test.proto

然后修改test_writer.py。

要改动的是test_pb2是你的3.2步骤生成的python文件名字。

3.4 生成json输出

然后执行python2 test_write.py,会看到类似json输出