protojson简介
google.golang.org/protobuf/encoding/protojson 是 Go 语言中的一个库,用于处理 Protocol Buffers(protobuf)和 JSON 之间的转换,遵循https://protobuf.dev/programming-guides/proto3#json实现。
以下是该库的一些主要功能:
- 将 protobuf 消息转换为 JSON 格式:这是通过
Marshal或MarshalOptions.Marshal函数实现的。这些函数接收一个 protobuf 消息并返回一个 JSON 格式的字符串。 - 将 JSON 格式的数据转换为 protobuf 消息:这是通过
Unmarshal或UnmarshalOptions.Unmarshal函数实现的。这些函数接收一个 JSON 格式的字符串和一个 protobuf 消息的指针,然后将 JSON 数据解析并填充到 protobuf 消息中。 - 自定义 JSON 编码和解码的行为:
MarshalOptions和UnmarshalOptions结构体提供了一些选项,可以用来自定义 JSON 编码和解码的行为。例如,可以通过EmitUnpopulated选项控制是否输出未设置的字段,通过UseProtoNames选项控制是否使用 protobuf 字段的原始名称作为 JSON 字段的键。 - 支持 Well-Known Types:该库提供了对 protobuf 的 Well-Known Types 的特殊处理,例如
Timestamp、Duration、Struct、Value等。
接下来我们以下面的 .proto 为例,介绍下如何使用 google.golang.org/protobuf/encoding/protojson ,并简单对比下 proto 、 protojson 和 encoding/json 三者之间的性能对比:
syntax = "proto3";
package example.pb;
option go_package = "./;pb";
import "google/protobuf/struct.proto";
message Base {
string tx_hash = 1;
int64 timestamp = 2;
google.protobuf.Struct extra = 3;
uint64 block_number = 4;
int32 category = 5;
}
message CertGen {
string id = 1;
string issuer = 2;
string name = 3;
string number = 4;
string seal_name = 5;
string seal_number = 6;
string sign_hash = 7;
string date = 8;
Base base = 9;
}
func genData() *pb.CertGen {
data := map[string]interface{}{
"name": "1234",
"age": 12,
"score": 1345.452434,
}
extra, _ := structpb.NewStruct(data)
base := &pb.Base{
TxHash: "1234556",
Timestamp: 1234566,
Extra: extra,
BlockNumber: 123456,
Category: 4,
}
return &pb.CertGen{
Id: uuid.NewString(),
Issuer: uuid.NewString(),
Name: uuid.NewString(),
Number: uuid.NewString(),
SealName: uuid.NewString(),
SealNumber: uuid.NewString(),
SignHash: uuid.NewString(),
Date: time.Now().Format(time.DateTime),
Base: base,
}
}
func BenchmarkProto(b *testing.B) {
gen := genData()
for i := 0; i < b.N; i++ {
proto.Marshal(gen)
}
}
func BenchmarkProtoJson(b *testing.B) {
gen := genData()
for i := 0; i < b.N; i++ {
protojson.Marshal(gen)
}
}
func BenchmarkStdJson(b *testing.B) {
gen := genData()
for i := 0; i < b.N; i++ {
json.Marshal(gen)
}
}
结果如下:
$ go test -bench=.
goos: linux
goarch: amd64
pkg: example
cpu: 12th Gen Intel(R) Core(TM) i7-1260P
BenchmarkProto-16 817065 1412 ns/op
BenchmarkProtoJson-16 218583 5372 ns/op
BenchmarkStdJson-16 343822 3216 ns/op
PASS
ok example 3.554s
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
protojson简介的更多相关文章
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
- 1.Hibernate简介
1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发; b.大大减少代码量; c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- 📝 App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
引言 在iOS应用程序开发过程中,进行App备案并获取公钥及证书SHA-1指纹是至关重要的步骤.本文将介绍如何通过appuploader工具获取iOS云管理式证书 Distribution Man ...
- 从此告别写 SQL!DataLeap 帮你零门槛完成“数据探查”
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在日常数据处理工作中,产品.运营.研发或数据分析师经常会面临数据量大且混乱.质量参差不齐的问题,需要花费大量时间和 ...
- 火山引擎云原生数据仓库 ByteHouse 技术白皮书 V1.0(上)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,<火山引擎云原生数据仓库 ByteHouse 技术白皮书>正式发布.白皮书简述了 ByteHou ...
- 用 Java?试试国产轻量的 Solon v1.10.1
相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...
- Axure 选中同意复选框后,改变登录按钮的颜色
登录时,当选中 同意用户协议后 复选框,登录按钮变颜色 登录按钮 设置登录按钮的选中颜色 同意协议 当同意复选框被选中后,设置 登录 的选中状态为 真,这时候触发登录按钮改变颜色, 取消勾选后,登录按 ...
- 【软件安装记录篇】本地虚拟机Centos7快速安装MySQL
安装 采用Installing MySQL on Linux Using the MySQL Yum Repository的方式进行安装. 1. 首先下载服务器版本对应的rpm文件,下载地址:[链接] ...
- 通义千问,阿里版ChatGPT,拿到邀请码了
大家好,我是章北海mlpy 通义千问是阿里巴巴推出的一个大型预训练模型,是达摩院自主研发的超大规模语言模型,能够回答问题.创作文字,还能表达观点.撰写代码. 昨天中午,阿里云通过官方微信公众号对旗下的 ...
- VA21 创建报价单
1.前台 报价是提供给客户交付货物或服务的一份文件,客户想要知道产品价格以及装运时间. 事务代码VA21 输入报价单类型和销售组织.分销渠道.产品组 输入售达方和行项目的物料信息,订购数量等信息 输入 ...
- AtCoder Beginner Contest 182 Person Editorial
Problem A - twiblr 直接输出 \(2A + 100 - B\) Problem B - Almost GCD 这里暴力枚举即可 int main() { ios_base::sync ...
- 数字孪生 3D 风电场,智慧风电之陆上风电
前言 "十四五"期间,在传统产业数字化升级和绿色改造领域.绿色低碳城镇化和现代城市建设领域.绿色低碳消费领域,和可再生能源或电力系统建设等领域,总投资可以达到近 45 万亿,平均每 ...