如何用脚本自动转化,一个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的版本号。
要不然可能会出现这个错误:
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输出
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- codeforces 349B(贪心)
- codeforces 1311D(暴力)
- codeforces 1382C1(思维)
- java学习原理篇|如何学习使用一个新工具
- codeforces 545C(贪心)
- codeforces 1272D(dp)
- codeforces 1203D2(贪心)
- HDOJ 2112(最短路)
- codeforces 1384A(构造)
- codeforces 982C (dfs)
- POJ 2493 (map)
- codeforces 1417C(思维)
- codeforces 1256C (贪心+构造)
- codeforces 722C(带权并查集+反向思维)
- codeforces 1144D(思维)