如何用脚本自动转化,一个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输出
- Golang中Interface类型详解
- 反序列化| 我欲修仙,法力无边。
- Go语言的网络编程简介
- golang基于redis lua封装的优先级去重队列
- 厚土Go学习笔记 | 28. go语言没有类 却可以在结构体或任意类型定义方法
- 41. select阻塞一个gorountine上的多个通讯操作 | 厚土Go学习笔记
- 40. range和channel的close | 厚土Go学习笔记
- 48. 访问MySql数据库增删改查和连接池及空字段处理 | 厚土Go学习笔记
- Go语言·我的性能我做主
- 量子计算对 bitcoin 的威胁
- 闲扯code review
- 你的Project Starter在哪里?
- Python网络_UDP编程
- Python网络_TCP/IP简介
- 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 数组属性和方法
- 给女同事讲完代理后,女同事说:你好棒哦
- 为什么我要从 Windows 切换到 Linux?
- 大白话带你认识 ZooKeeper !重要概念一网打尽!
- 如何在 Node.js 中判断一个文件是否存在?
- 我参与了两个接近100k+star的开源项目!聊聊开源项目贡献指南
- 最新更新 | Kafka - 2.6.0版本发布新特性说明
- 利用Libra进行机器学习和深度学习
- I2C总线架构 之 总线驱动
- 一文讲透“布隆过滤器”
- 基于PySpark的流媒体用户流失预测
- 盘一盘 Python 特别篇 21 - 分箱之 qcut
- 挖洞经验 | 以SSRF获取Zimbra邮件服务的用户明文凭据
- Office文件追踪方案探索
- 如何全方位地给 SQL Server 做测试
- 下下下一代防火墙关键技术漫谈