python中protobuf和json互相转换应用处理方法

当我们需要在Python中进行数据传输时,常用的数据格式是JSON(JavaScript Object Notation)。由于JSON文本格式较为简洁,易于阅读和编写,因此在网络上广泛应用。但在某些应用场景下,JSON却存在着一些限制,如传输大量二进制数据时,每个字节需要被转义为字符串,这会大大增加传输数据的大小,降低传输效率。因此,一些开发者选择使用Protocol Buffers作为数据格式。在以下教程中,我们将会学习如何使用Python中的protobuf和json之间进行互相转换。

protobuf与json格式介绍

protobuf格式

protobuf是Protocol Buffers的简称。它是由Google公司开发的一种数据序列化协议,可用于序列化结构化数据,支持多种编程语言。protobuf定义了消息格式和消息之间的交互规则。相比JSON格式,protobuf格式具可读性好,数据传输体积小,传输速度快,可扩展性强等优点。

JSON格式

JSON是JavaScript对象标记语言,是一种轻量级的数据交换格式。JSON格式具有简单明了、易于人阅读、语法简洁等优点,常用于网络传输数据。

protobuf和json互相转换的应用处理方法

序列化为protobuf格式

定义protobuf数据结构通常需要.proto文件,语法类似于C++语言,定义了消息的类型、字段中包含的数据类型和名称、消息按哪个顺序进行编码等元数据信息。在Python中,我们需要使用Google发布的Python语言的proto3库将Python对象序列化为protobuf消息。

示例1:定义protobuf数据结构

syntax = "proto3";

message Person {
  string name = 1;
  int32 age = 2;
  repeated string emails = 3;
}

在示例1中,我们定义了一个Person类型,包含姓名、年龄和电子邮件三个字段。

示例2:Python对象序列化为protobuf消息

import person_pb2

# 新建person对象
person = person_pb2.Person()
person.name = 'Tom'
person.age = 20
person.emails.extend(['mymail@example.com', 'yourmail@example.com'])

# 序列化为protobuf消息
serialized_message = person.SerializeToString()

在示例2中,我们使用Python的person_pb2模块中定义好的Person类来新建一个person对象,并设置对象的属性。最后,我们使用SerializeToString()方法将对象序列化为protobuf消息,可以在网络中进行传输。

反序列化为Python对象

当我们收到protobuf消息时,需要将其反序列化为Python对象,再进行后续的处理。

示例3:从protobuf消息反序列化为Python对象

import person_pb2

# 读取protobuf消息
serialized_message = b'\n\tTom\x10\x14\x1a\x12mymail@example.com\x1a\x14yourmail@example.com'
person = person_pb2.Person()
person.ParseFromString(serialized_message)

# 对象反序列化后,可以直接访问对象属性
print(f'Name: {person.name}')
print(f'Age: {person.age}')
print(f'Emails: {person.emails}')

在示例3中,我们将收到的protobuf消息反序列化为Python对象。使用Person类的ParseFromString()方法,解析收到的消息并将其赋值给person对象。这时,person对象的属性已经设置完成,我们可以直接访问它们的值,并进行后续的处理。

序列化为JSON格式

由于Python内置的JSON模块不支持直接序列化protobuf消息,因此我们需要将protobuf消息先转换为字典,再使用JSON模块将字典序列化为JSON格式。

示例4:将protobuf消息转换为字典,并序列化到JSON格式

import json
import person_pb2

# 新建person对象
person = person_pb2.Person()
person.name = 'Tom'
person.age = 20
person.emails.extend(['mymail@example.com', 'yourmail@example.com'])

# 将protobuf消息转换为字典,并序列化到JSON格式
person_dict = {
    'name': person.name,
    'age': person.age,
    'emails': list(person.emails),
}
json_str = json.dumps(person_dict)

# 查看JSON格式的字符串
print(json_str)

在示例4中,我们先新建一个person对象,并设置它的属性。接着,我们将person对象转换为字典,再使用Python内置的json模块的dumps()方法将字典序列化为JSON格式。最后,我们可以输出得到的JSON格式字符串。

反序列化为Python对象

对于从JSON格式得到的数据,我们需要将其转换为Python对象进行处理。由于Python接收到的JSON数据不包含字段类型信息,因此我们需要为其他人编写消息类型生成的.protobuf数据文件生成新的Python类,以便反序列化JSON数据。

示例5:从JSON格式反序列化为Python对象

import json
import person_pb2

# 读取JSON格式字符串
json_str = '{"name": "Tom", "age": 20, "emails": ["mymail@example.com", "yourmail@example.com"]}'
person_dict = json.loads(json_str)

# 将字典转换为person对象
person = person_pb2.Person()
person.name = person_dict['name']
person.age = person_dict['age']
person.emails.extend(person_dict['emails'])

# 查看person对象的属性
print(f'Name: {person.name}')
print(f'Age: {person.age}')
print(f'Emails: {person.emails}')

在示例5中,我们将JSON格式的字符串读取到person_dict字典中,并将其转换为person对象。person对象的属性设置完成后,我们可以直接访问它们的值,并进行后续的处理。

结论

在网络传输或数据持久化中,我们需要选择适合应用场景的数据格式。对于一些大量二进制数据的传输场景,protobuf格式相比于JSON格式则具有较为明显的优势。我们通过上述示例,学习了在Python中protobuf和json之间进行互相转换的方法,这对我们处理数据和进行协议设计具有较高的参考价值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中protobuf和json互相转换应用处理方法 - Python技术站

(1)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言如何计算字符串长度

    计算字符串长度是一种常见的字符串操作。在C语言中,字符串是以null字符 (‘\0’) 作为结束符的字符数组,因此计算字符串长度可以通过统计数组中的字符数来实现。下面是计算字符串长度的完整攻略: 方法一:使用标准库函数strlen() C语言标准库提供了一个函数strlen(),它可以非常方便地计算字符串的长度。该函数的定义如下: size_t strlen…

    C 2023年5月23日
    00
  • C语言队列和应用详情

    C 语言队列和应用详情 什么是队列 队列是一种数据结构,可以用来存储一组按顺序排列的元素。队列的特点就是先进先出,即First In First Out,缩写为 FIFO。也就是说,最先插入队列的元素会最先被取出,最后插入队列的元素则会最后被取出。常见的生活中队列应用包括的排队取号,排队坐火车,排队打饭等等。 C 语言实现队列 在 C 语言中,我们可以通过数…

    C 2023年5月23日
    00
  • JS 实现Json查询的方法实例

    JS 实现JSON查询的方法实例 在项目中,我们常常需要通过给定的条件查询数据。如果数据存储在JSON格式的文件中,我们可以使用JS实现JSON查询。下面是JS实现JSON查询的方法实例。 1. 获取JSON数据 首先,我们需要获取JSON数据。这可以是从服务器或本地文件中获取。在本例中,我们将使用本地文件。我们可以使用XMLHttpRequest对象获取J…

    C 2023年5月23日
    00
  • C++破坏MBR的代码

    如您所说,破坏MBR的代码足以引起恶意行为,为避免安全问题,我不会提供完整的攻击攻略,但我可以为您提供一些基础知识。 MBR,即主引导记录,是位于计算机存储器媒介(例如硬盘或闪存驱动器)的最前面的一段代码。MBR包含有关媒介分区和引导程序的信息,以便启动从选定分区的操作系统。因此,MBR的完整性对于系统的正常启动至关重要。如果MRR被破坏,系统将无法启动或无…

    C 2023年5月24日
    00
  • C++中对象的赋值与复制操作详细解析

    C++中对象的赋值与复制操作详细解析 对于C++开发者来说,对象的赋值和复制操作是非常常见的操作,然而,它们并不总是像我们想象中的那样简单,不合理的复制操作甚至会导致程序崩溃。本文将详细讲解C++中对象的赋值和复制操作。 赋值操作符 当我们创建一个对象并赋值给另一个对象时,我们需要使用赋值操作符(=)。如下所示: MyClass obj1; MyClass …

    C 2023年5月22日
    00
  • Shell在日常工作中的应用实践

    作者:京东物流 李光新 1 Shell可以帮我们做什么 作为一名测试开发工程师,在与linux服务器交互过程中,大都遇到过以下这些问题: •一次申请多台服务器,多台服务器需要安装相同软件,配置相同的环境,同样的操作需要重复多次; •工作中经常会使用命令行命令来完成我们的一些操作,但是有些命令使用率很高,而且很长,每次都全部敲进去势必会浪费很多时间(比如查日志…

    C语言 2023年4月22日
    00
  • Linux中rm命令使用以及C/C++代码实现

    下面我将为你详细讲解“Linux中rm命令使用以及C/C++代码实现”的完整攻略。 一、Linux中rm命令使用 1. 命令格式 rm 命令的格式如下: rm [选项] 文件名 2. 常用选项 以下是 rm 命令常用选项的说明: -r:递归删除目录及目录中的所有文件和子目录。该选项不会询问用户是否确认删除,除非使用了 -i 选项。 -f:强制删除文件或目录,…

    C 2023年5月23日
    00
  • c语言如何设置随机数及逐行解析

    下面详细讲解一下“c语言如何设置随机数及逐行解析”的攻略。 1. 设置C语言随机数 可以使用标准库函数rand()和srand()来生成随机数。 1.1 srand()函数 在使用随机数之前,应该先使用srand()函数来初始化随机数生成器。这是因为随机数是由一个伪随机数生成器生成的,这个伪随机数生成器的起始位置在每次程序启动时都是相同的。因此,如果不初始化…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部