protojson简介

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

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 三者之间的性能对比:
  1. syntax = "proto3";
  2. package example.pb;
  3. option go_package = "./;pb";
  4. import "google/protobuf/struct.proto";
  5. message Base {
  6.     string tx_hash = 1;
  7.     int64 timestamp = 2;
  8.     google.protobuf.Struct extra = 3;
  9.     uint64 block_number = 4;
  10.     int32 category = 5;
  11.   }
  12. message CertGen {
  13.     string id = 1;
  14.     string issuer = 2;
  15.     string name = 3;
  16.     string number = 4;
  17.     string seal_name = 5;
  18.     string seal_number = 6;
  19.     string sign_hash = 7;
  20.     string date = 8;
  21.     Base base = 9;
  22. }
复制代码
  1. func genData() *pb.CertGen {
  2.         data := map[string]interface{}{
  3.                 "name":  "1234",
  4.                 "age":   12,
  5.                 "score": 1345.452434,
  6.         }
  7.         extra, _ := structpb.NewStruct(data)
  8.         base := &pb.Base{
  9.                 TxHash:      "1234556",
  10.                 Timestamp:   1234566,
  11.                 Extra:       extra,
  12.                 BlockNumber: 123456,
  13.                 Category:    4,
  14.         }
  15.         return &pb.CertGen{
  16.                 Id:         uuid.NewString(),
  17.                 Issuer:     uuid.NewString(),
  18.                 Name:       uuid.NewString(),
  19.                 Number:     uuid.NewString(),
  20.                 SealName:   uuid.NewString(),
  21.                 SealNumber: uuid.NewString(),
  22.                 SignHash:   uuid.NewString(),
  23.                 Date:       time.Now().Format(time.DateTime),
  24.                 Base:       base,
  25.         }
  26. }
  27. func BenchmarkProto(b *testing.B) {
  28.         gen := genData()
  29.         for i := 0; i < b.N; i++ {
  30.                 proto.Marshal(gen)
  31.         }
  32. }
  33. func BenchmarkProtoJson(b *testing.B) {
  34.         gen := genData()
  35.         for i := 0; i < b.N; i++ {
  36.                 protojson.Marshal(gen)
  37.         }
  38. }
  39. func BenchmarkStdJson(b *testing.B) {
  40.         gen := genData()
  41.         for i := 0; i < b.N; i++ {
  42.                 json.Marshal(gen)
  43.         }
  44. }
复制代码
结果如下:
  1. $ go test -bench=.
  2. goos: linux
  3. goarch: amd64
  4. pkg: example
  5. cpu: 12th Gen Intel(R) Core(TM) i7-1260P
  6. BenchmarkProto-16                 817065              1412 ns/op
  7. BenchmarkProtoJson-16             218583              5372 ns/op
  8. BenchmarkStdJson-16               343822              3216 ns/op
  9. PASS
  10. ok      example       3.554s
复制代码
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表