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++ 获取Windows系统的位数32位或64位的实现代码

    获取Windows系统的位数(32位或64位)可以使用以下两个API函数: GetSystemWow64DirectoryA(): 该函数用于获取系统WoW64目录的路径,其中WoW64指的是Windows-on-Windows 64,它是一种允许32位应用程序在64位Windows操作系统上运行的技术。该函数存在后,Windows操作系统具备x64版本和x…

    C 2023年5月23日
    00
  • win7系统开机搜狗应用程序错误(0xc0000409)导致电脑死机

    问题描述 有用户反馈在使用 Win7 系统开机时,出现搜狗应用程序错误(0xc0000409)导致电脑死机的问题。为了解决这个问题,下面是一个完整攻略。 步骤一:删除搜狗输入法 由于问题是由搜狗应用程序引起的,我们可以尝试卸载搜狗输入法以解决问题。具体步骤如下: 点击桌面左下角 Windows 图标,打开“控制面板”。 在“控制面板”页面中,选择“程序”。 …

    C 2023年5月23日
    00
  • C调用C++代码的方法步骤

    C语言是一款面向过程的语言,而C++语言是一款面向对象的语言。虽然二者有着许多相似之处,但仍然会存在一些不兼容的情况,在C中调用C++代码时也是如此。下面介绍一下C调用C++代码的方法步骤。 步骤 在C++文件中,声明被调用的函数为extern “C” #ifdef __cplusplus extern "C" { #endif // y…

    C 2023年5月23日
    00
  • c++动态内存管理与智能指针的相关知识点

    C++动态内存管理与智能指针攻略 知识点介绍 在 C++ 编程中,动态内存管理是非常重要的一部分。当我们需要在程序运行时动态生成对象或者数组,需要使用动态内存。但是,如果我们没有妥善管理动态内存,就会出现内存泄漏等严重问题,使程序出现崩溃等异常情况。 智能指针是 C++ 提供的一种便捷的动态内存管理方式,可以减少我们对内存的手动管理。使用智能指针可以避免内存…

    C 2023年5月22日
    00
  • C语言字符串快速压缩算法代码

    C语言字符串快速压缩算法代码攻略 前置知识 在学习C语言字符串快速压缩算法代码之前,需要掌握以下知识: C语言基础知识,包括数据类型、变量、数组、函数等 指针的基本概念和用法 位运算的概念和用法 基本的压缩算法知识 快速压缩算法核心原理 快速压缩算法的核心原理在于用少量的空间存储尽可能多的信息。在字符串压缩中,我们可以利用位运算来压缩数据,将多个字符压缩成一…

    C 2023年5月22日
    00
  • 微影Q8C投影仪好不好呢?微影Q8C投影仪体验评测

    微影Q8C投影仪体验评测 简介 微影Q8C是一款迷你投影仪,它采用DLP显示技术,支持1080P全高清分辨率,最大投影尺寸为120英寸。这款投影仪可以连接多种设备,如电脑、手机、平板等,带来全方位的投影体验。 外观设计 微影Q8C采用圆形外观设计,造型简洁美观。它的体积仅为130mm x 130mm x 33mm,非常小巧便携。投影仪配备了多个接口,包括HD…

    C 2023年5月22日
    00
  • 谷歌Pixel C平板电脑做工怎么样?Google Pixel C拆机全过程评测图解

    谷歌Pixel C平板电脑做工怎么样? 1. 硬件外观 Pixel C的外观采用了一块10.2英寸的屏幕,分辨率为2560 x 1800,屏幕背面采用了金属材质设计,显得更加高端大气。屏幕的边框采用了比较窄的设计,让整个屏幕看起来更加大气美观。 2. 做工 Pixel C的做工非常精细,整个设备采用了一体化模具设计,不仅外观简洁大气,而且手感舒适。机身作为单…

    C 2023年5月23日
    00
  • python 与c++相互调用实现

    下面是关于Python和C++相互调用实现的完整攻略。 概述 Python和C++都是广泛使用的编程语言,在某些场景下,调用C++代码可以有效提高Python的执行效率。而Python也可以供C++使用高级编程能力。因此,Python和C++之间的相互调用具有很大的实用价值。接下来,我们将介绍如何在Python和C++之间实现相互调用。 实现方法 Pytho…

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