-
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:https://mengbin92.github.io/
cnblogs: 恋水无意
出处:https://www.cnblogs.com/lianshuiwuyi/p/17640441.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式