github.com/hyperledger/fabric-config/protolator 是 Hyperledger Fabric 中的一个 Go 包,用于将 Protocol Buffers(ProtoBuf)消息和 JSON 格式之间进行转换。它提供了一种方便的方式来将 Fabric 配置文件(以 ProtoBuf 格式表示)与 JSON 配置文件之间进行相互转换。这对于 Fabric 的配置管理和部署非常有用,使得用户可以轻松地在不同的配置格式之间进行切换。

功能和用法

protolator 提供了一组功能,用于在 ProtoBuf 格式和 JSON 格式之间进行转换:

DeepMarshalJSON

func DeepMarshalJSON(m proto.Message) ([]byte, error)

  • 该方法用于将给定的 ProtoBuf 消息 m 转换为 JSON 格式的字节流。
  • 它递归地将 ProtoBuf 的消息及其子消息转换为 JSON 格式,返回表示 JSON 格式数据的字节流。
  • 注意:转换后的 JSON 字节流将具有缩进格式,易于阅读。

DeepUnmarshalJSON

func DeepUnmarshalJSON(data []byte, m proto.Message) error

  • 该方法用于将给定的 JSON 格式字节流 data 转换为指定的 ProtoBuf 消息 m
  • 它递归地将 JSON 格式的数据解析并填充到 m 中,返回 nil 或错误。
  • 注意:JSON 字节流必须是有效的,并且与目标消息 m 的结构相匹配。

Nested

type Nested struct{...}

  • Nested 类型是用于 ProtoBuf 和 JSON 之间可嵌套转换的通用转换器。
  • 它提供了 MarshalUnmarshal 方法,用于将 ProtoBuf 格式的消息转换为可嵌套的 JSON 格式,以及将可嵌套的 JSON 格式转换为 ProtoBuf 格式。

使用示例

package main

import (
"fmt"
"github.com/golang/protobuf/proto"
"github.com/hyperledger/fabric-config/protolator"
"encoding/json"
) // 使用 proto 文件定义的 message 结构
// 假设定义了 proto 文件如下:
// message MyData {
// string name = 1;
// int32 age = 2;
// }
type MyData struct {
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
Age int32 `protobuf:"varint,2,opt,name=age" json:"age,omitempty"`
} func main() {
// 创建一个 MyData 实例
data := &MyData{
Name: "John",
Age: 30,
} // 使用 DeepMarshalJSON 将 ProtoBuf 数据转换为 JSON 字节流
jsonData, err := protolator.DeepMarshalJSON(data)
if err != nil {
fmt.Println("Error marshaling to JSON:", err)
return
} // 使用 DeepUnmarshalJSON 将 JSON 字节流转换为 ProtoBuf 数据
newData := &MyData{}
err = protolator.DeepUnmarshalJSON(jsonData, newData)
if err != nil {
fmt.Println("Error unmarshaling from JSON:", err)
return
} // 输出结果
fmt.Println("Original data:", data)
fmt.Println("JSON data:", string(jsonData))
fmt.Println("Unmarshaled data:", newData)
}

在上述示例中,我们使用 github.com/hyperledger/fabric-config/protolatorDeepMarshalJSON 方法将 MyData 结构体从 ProtoBuf 格式转换为 JSON 格式的字节流,并使用 DeepUnmarshalJSON 方法将 JSON 字节流再转换回 ProtoBuf 格式的数据。输出结果显示了原始数据、转换后的 JSON 数据以及再次转换回来后的数据。


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意


protolator - Protobuf <==> json的更多相关文章

  1. protobuf json xml比较

    1 protobuf/xml/json对比 从数据的存储格式的角度进行对比 假如要存储一个键值对: {price:150} 1.1 protobuf的表示方式 message  Test { opti ...

  2. golang gob 有什么优势? gob/protobuf/json/xml 效率对比,benchmark 压力测试

    TODO 待研究: https://blog.csdn.net/love_se/article/details/7941876 https://blog.csdn.net/wangshubo1989/ ...

  3. Redis JdkSerializationRedisSerializer,stringRedisSerializer,ProtoBuf 体积,性能简单比较.

    /** * User: laizhenwei * Date: 2018-04-10 Time: 14:17 * Description: */ @RunWith(SpringRunner.class) ...

  4. 让SpringBoot的jackson支持JavaBean嵌套的protobuf

    问题背景 REST 项目使用protobuf 来加速项目开发,定义了很多model,vo,最终返回的仍然是JSON. 项目中一般使用 一个Response类, public class Respons ...

  5. protobuf 协议浅析

    目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...

  6. 《OD学Flume》20160806Flume和Kafka

    一.Flume http://flume.apache.org/FlumeUserGuide.html Flume是一个分布式的,可靠的,可用的,非常有效率的对大数据量的日志数据进行收集.聚集.移动信 ...

  7. iOS 让CoreData更简单些

    原文:http://www.cocoachina.com/ios/20170421/19096.html 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而 ...

  8. 谁能用通俗的语言解释一下什么是 RPC 框架?

    转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题 关于RPC你的题目是RPC框架,首先了解什么叫RP ...

  9. .net core高性能通讯开源组件BeetleX

    BeetleX beetleX是基于dotnet core实现的轻量级高性能的TCP通讯组件,使用方便.性能高效和安全可靠是组件设计的出发点!开发人员可以在Beetlx组件的支持下快带地构建高性能的T ...

  10. (译)xDS REST and gRPC protocol

    xDS REST and gRPC protocol 原文地址:xDS REST and gRPC protocol. envoy可通过文件系统.一个或多个管理服务器来发现各种动态资源.这些服务发现和 ...

随机推荐

  1. 2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠,即两个区间的左右端点不可以完全一样。

    2022-06-27:给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等, 这两个区间可以相交,但是不可以完全重叠,即两个区间的左右端点不可以完全一样. ...

  2. 2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=

    2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间. 给定一个正数m,表示有m个人等位. 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n&l ...

  3. 2022-04-07:给定一个只由‘a‘和‘b‘组成的字符串str, str中“ab“和“ba“子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消除的子串... 你的任务是决定一种消除的

    2022-04-07:给定一个只由'a'和'b'组成的字符串str, str中"ab"和"ba"子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消 ...

  4. 2021-06-29:在两个都有序的数组中找整体第K小的数。

    2021-06-29:在两个都有序的数组中找整体第K小的数. 福大大 答案2021-06-29: 1.A和B长度不等的时候,需要把A和B的长度变成相等. A是短数组,B是长数组. 第k小的数,k从1开 ...

  5. 日增数据超10PB!揭秘沃尔玛Lakehouse架构选型之路

    沃尔玛系统产生了世界上最大和最多样化的数据集之一,每天数据增长超 10 PB. 来自许多不同的来源及其支持的后端系统,一系列大量的业务事件流被发送到主要由 Apache Kafka 支持的消息传递层. ...

  6. prefetch_related() 一对多、多对多查询优化,反向查询

    prefetch_related() 一对多.多对多查询优化,反向查询 Student.objects.filter(age__lt=30).prefetch_related('course') # ...

  7. drf——序列化之source(了解)、定制字段的两种方式(重要)、多表关联反序列化保存、反序列化字段校验、ModelSerializer使用

    1 序列化高级用法之source(了解) # 1.创建了5个表(图书管理的5个) # 2.对book进行序列化 # 总结:source的用法 1.修改前端看到的字段key值--->source指 ...

  8. 2014年蓝桥杯C/C++大学B组省赛真题(李白打酒)

    题目描述: 题目描述 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店 ...

  9. 云服务器挂载easyconnect

    参考:easyconnect命令版地址 https://github.com/Hagb/docker-easyconnect 前提条件: 云服务器(以阿里云服务器 Centos7.6 为例) 用途: ...

  10. k8s calico网络