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.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
随机推荐
- Flutter加固原理及加密处理
引言 为了保护Flutter应用免受潜在的漏洞和攻击威胁,加固是必不可少的措施之一.Flutter加固原理主要包括代码混淆.数据加密.安全存储.反调试与反分析.动态加载和安全通信等多个方面.通过综 ...
- Mindjet MindManager 拖动页面
常规的软件是按住空格建+鼠标左健 进行拖放,但 MindManager 不支持,如何对Mindjet MindManager 拖动页面? 按住 鼠标右键 直接拖拽 配合 Ctrl+滚轮 放大缩小,一起 ...
- 多智能体协同控制研究中光学动作捕捉与UWB定位技术比较
人类在进行任何工作时,总是强调团队合作,teamwork.随着控制科学.计算机科学等多学科的交叉发展与融合,在智能体控制领域,对于单个机器人,无人机,无人车的控制已经不能满足现在领域的技术需求,从而和 ...
- 将文件从windows格式改为linux格式
1.使用notepad++软件转换 notepad++官方下载地址 使用notepad++打开文件---编辑---文档格式转换---转为unix---上传至linux 2.set ff vim 文件, ...
- C223 生产版本BAPI
1.事务代码:C223 2.调用函数CM_FV_PROD_VERS_DB_UPDATE "-----------------------------@斌将军----------------- ...
- 0x01 基本算法-位运算
A题:a^b https://ac.nowcoder.com/acm/contest/996/A 题目描述 求 a 的 b 次方对 p 取模的值,其中 0 <= a,b,p <= 10^9 ...
- vue 状态管理 三、Mutations和Getters用法
系列导航 vue 状态管理 一.状态管理概念和基本结构 vue 状态管理 二.状态管理的基本使用 vue 状态管理 三.Mutations和Getters用法 vue 状态管理 四.Action用法 ...
- vue学习笔记 二、环境搭建+项目创建
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- uniapp#实现自定义省市区三级联动
uni-APP中的三级联动(省市区)---数据前端写死 https://blog.csdn.net/lwaner/article/details/107150805 uniapp#实现自定义省市区三级 ...
- vue网站换色功能
vue.config.js里全局配置mixin.scss: 使用: 判断 sessionStorage 中的 type 是否为空,如果为空的话,就给默认的颜色(页面初始化的颜色),如果不为空的话就将对 ...