首页 > 其他分享 >protojson简介

protojson简介

时间:2023-08-18 14:46:03浏览次数:42  
标签:uuid 简介 JSON protojson NewString string protobuf

google.golang.org/protobuf/encoding/protojson 是 Go 语言中的一个库,用于处理 Protocol Buffers(protobuf)和 JSON 之间的转换,遵循https://protobuf.dev/programming-guides/proto3#json实现。

以下是该库的一些主要功能:

  • 将 protobuf 消息转换为 JSON 格式:这是通过 MarshalMarshalOptions.Marshal 函数实现的。这些函数接收一个 protobuf 消息并返回一个 JSON 格式的字符串。
  • 将 JSON 格式的数据转换为 protobuf 消息:这是通过 UnmarshalUnmarshalOptions.Unmarshal 函数实现的。这些函数接收一个 JSON 格式的字符串和一个 protobuf 消息的指针,然后将 JSON 数据解析并填充到 protobuf 消息中。
  • 自定义 JSON 编码和解码的行为:MarshalOptionsUnmarshalOptions 结构体提供了一些选项,可以用来自定义 JSON 编码和解码的行为。例如,可以通过 EmitUnpopulated 选项控制是否输出未设置的字段,通过 UseProtoNames 选项控制是否使用 protobuf 字段的原始名称作为 JSON 字段的键。
  • 支持 Well-Known Types:该库提供了对 protobuf 的 Well-Known Types 的特殊处理,例如 TimestampDurationStructValue 等。

接下来我们以下面的 .proto 为例,介绍下如何使用 google.golang.org/protobuf/encoding/protojson ,并简单对比下 protoprotojsonencoding/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: 恋水无意


标签:uuid,简介,JSON,protojson,NewString,string,protobuf
From: https://www.cnblogs.com/lianshuiwuyi/p/17640441.html

相关文章

  • (一)Qt与Python—PySide的简介及安装
    目录1.Pyside的简介2.pyside的安装3.pyside的Helloworld程序4.参考文献及网站连接1.Pyside的简介​PySide(在本文中指代PySide2和PySide6)是一个Python的图形化界面(GUI)库,由C++版的Qt开发而来,在用法上基本与C++版没有特别大的差异。PySide是一个python绑定的跨平台图形化......
  • Prototype 原型模式简介与 C# 示例【创建型4】【设计模式来了_4】
    〇、简介1、什么是原型模式?一句话解释:  针对比较耗时的对象创建过程,通过原型的Clone方法来克隆对象,而非重新创建。原型设计模式(PrototypeDesignPattern)是一种创建型设计模式,其主要目的是通过复制已有对象来创建新的对象,而无需通过实例化类并初始化其属性。这种模式在需......
  • 【Web开发指南】MyEclipse XML编辑器的高级功能简介
    1.在MyEclipse中编辑XML本文档介绍MyEclipse XML编辑器中的一些可用的函数,MyEclipse XML编辑器包括高级XML编辑,例如:语法高亮显示标签和属性内容辅助实时验证(当您输入时)文档内容的源(Source)视图、设计(Design)视图和大纲(Outline)视图文档格式内容辅助模板2.编辑模式使用MyEclipse......
  • 【Web开发指南】MyEclipse XML编辑器的高级功能简介
    MyEclipsev2023.1.2离线版下载1.在MyEclipse中编辑XML本文档介绍MyEclipse XML编辑器中的一些可用的函数,MyEclipse XML编辑器包括高级XML编辑,例如:语法高亮显示标签和属性内容辅助实时验证(当您输入时)文档内容的源(Source)视图、设计(Design)视图和大纲(Outline)视图文档格......
  • ROCm平台简介及使用
    前言 参考1. ROCm平台简介及使用汇总_后来居上_m的博客-CSDN博客;2. AMDROCm™Documentation—ROCm5.6.0DocumentationHome;3. AMD@SC15:BoltzmannInitiativeAnnounced-C++andCUDACompilersforAMDGPUs;4. HIPIFYDocumentation—HIPIFYDocumentati......
  • 原生CSS嵌套简介
    嵌套是使用Sass等CSS预处理器的核心原因之一。现在,该功能已经以类似的语法出现在标准浏览器CSS中。你能否在构建系统时放弃对预处理器的依赖?CSS嵌套可以节省输入时间,并使语法更易于阅读和维护。迄今为止,你必须像这样键入完整的选择器路径:.parent1.child1,.parent2.child1{......
  • 计算机视觉智能中医(一):中国大学生计算机大赛二等奖中e诊简介
    文章目录1系列文章导航2写文目的3项目总体介绍3.1项目背景3.1.1创意来源3.1.2选题意义3.2系统功能3.3系统软硬件平台3.3.1系统开发平台3.3.2系统运行平台1系列文章导航系列文章2计算机视觉智能中医(二):基于mediapipe的手掌图片穴位识别系列文章3计算机视觉智能中医(三):......
  • Map简介
    一、Map特点1.Map集合概述:Map集合是双列集合,每个元素拥有两个数据Map集合每个元素的格式为:key=value(键值对集合),因此也可以称作键值对集合2.Map集合体系特点:Map集合的特点由键决定Map集合的键是无序,不重复,无索引的,值可重复,且可以为nullMap集合后面重复的键对应的值会覆盖前面......
  • mybatis系列: 简介以及使用
    目录一、简介二、简单使用一、简介MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUD。MyBatis在三层架构中负责持久层的,属于持久层框架。MyBatis的发展历程:【引用百度百科】MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了go......
  • AI简介-AI基础系列文章第1篇
    您的关注是对我最大的支持......