protobuf与json转换小结

protobuf与json转换小结是一个比较常见的问题,在这里我将为你提供一个完整的攻略。

什么是protobuf

Protobuf(Protocol Buffers)是Google开发的一种轻便、高效、通用的数据序列化格式,可以用于数据存储、RPC(Remote procedure call)和数据交换等领域。它与XML和JSON等其他序列化格式相比,更为紧凑、快速,而且具有更好的性能。

在使用Protobuf前,需要定义一个.proto文件,该文件定义了要序列化的数据结构和数据类型。在定义好.proto文件的所有内容后,通过利用ProtoBuf中的编译器生成所需的数据对应的代码,进而在代码中调用对应接口进行数据序列化和反序列话操作。

protobuf与json之间的转换

Protobuf和JSON之间的转换非常常见,下面是protobuf和JSON之间转换的两种方式:

第一种方式:使用protobuf自带的JsonFormat工具

protobuf在自己的库中提供了JsonFormat工具,可以在protobuf和JSON之间进行转换,下面是转换的示例:

定义.proto文件

syntax = "proto3";

package tutorial;

message Person {
  string name = 1;
  int32 id = 2;  // Unique ID number for this person.
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phones = 4;
}

生成对应的数据结构

通过proto文件生成对应的数据结构:

protoc --proto_path=. --python_out=. ./person.proto

生成person_pb2.py文件,包含了所有protobuf数据对应的Python类

protobuf数据序列化为JSON字符串

import json
from google.protobuf.json_format import MessageToJson
from tutorial.person_pb2 import Person, PhoneNumber

def protobuf_to_json():
  person = Person()
  person.name = "John Doe"
  person.id = 1234
  person.email = "jdoe@example.com"
  phone = PhoneNumber()
  phone.number = "555-4321"
  phone.type = Person.HOME
  person.phones.append(phone)

  # 将protobuf数据转换为JSON字符串
  json_str = MessageToJson(person)
  print(json_str)

执行代码生成的JSON字符串为:

{
  "name": "John Doe",
  "id": 1234,
  "email": "jdoe@example.com",
  "phones": [
    {
      "number": "555-4321",
      "type": "HOME"
    }
  ]
}

JSON字符串反序列化为protobuf数据

def json_to_protobuf():
  json_str = """
  {
    "name": "John Doe",
    "id": 1234,
    "email": "jdoe@example.com",
    "phones": [
      {
        "number": "555-4321",
        "type": "HOME"
      }
    ]
  }
  """

  # 将JSON字符串转换为protobuf数据
  person = Person()
  json_format.Parse(json_str, person)
  print(person.name, person.id, person.email, person.phones[0].number, person.phones[0].type)

第二种方式:手动转换

不使用protobuf自带的工具,而是使用Python中自带的json库、protobuf库中自带的编码和解码方法手动转换。下面是手动转换的示例:

protobuf数据序列化为JSON字符串

def protobuf_to_json2():
  person = Person()
  person.name = "John Doe"
  person.id = 1234
  person.email = "jdoe@example.com"
  phone = PhoneNumber()
  phone.number = "555-4321"
  phone.type = Person.HOME
  person.phones.append(phone)

  # 手动序列化:protobuf数据转换为Python字典
  person_dict = {
    "name": person.name,
    "id": person.id,
    "email": person.email,
    "phones": [{
      "number": p.number,
      "type": p.type
    } for p in person.phones]
  }

  # 将Python字典转换为JSON字符串
  json_str = json.dumps(person_dict, indent=2)
  print(json_str)

执行代码生成的JSON字符串为:

{
  "name": "John Doe",
  "id": 1234,
  "email": "jdoe@example.com",
  "phones": [
    {
      "number": "555-4321",
      "type": "HOME"
    }
  ]
}

JSON字符串反序列化为protobuf数据

def json_to_protobuf2():
  json_str = """
  {
    "name": "John Doe",
    "id": 1234,
    "email": "jdoe@example.com",
    "phones": [
      {
        "number": "555-4321",
        "type": "HOME"
      }
    ]
  }
  """

  # 将JSON字符串转换为Python字典
  person_dict = json.loads(json_str)

  # 手动反序列化:Python字典转换为protobuf数据
  person = Person()
  person.name = person_dict["name"]
  person.id = person_dict["id"]
  person.email = person_dict["email"]
  for phone_dict in person_dict["phones"]:
    phone = person.phones.add()
    phone.number = phone_dict["number"]
    phone.type = getattr(Person.PhoneType, phone_dict["type"])

  print(person.name, person.id, person.email, person.phones[0].number, person.phones[0].type)

总结

以上就是protobuf和JSON之间转换的两种方式。如果你了解了protobuf文件的定义和Python中使用Protobuf的基本知识,在protobuf和JSON之间进行转换并不会是一件难事。哪个转换方式更好,需要根据实际情况来选择,这里的示例只是展示了两种基本的转换方法,具体的应用需要根据实际情况进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:protobuf与json转换小结 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • JavaWeb开发中alias拦截器的使用方法

    下面我将为你详细讲解JavaWeb开发中alias拦截器的使用方法。 什么是alias拦截器? 在JavaWeb开发中,Alias拦截器是指通过将URL路径转发到目标路径,从而达到拦截请求并作出相应响应的效果。 Alias拦截器的使用方法 配置Struts.xml文件 要使用Alias拦截器,请在struts.xml文件中添加以下配置: <interc…

    Java 2023年5月20日
    00
  • java实现的汉字转五笔功能实例

    下面是详细讲解 Java 实现的汉字转五笔功能实例的完整攻略。 1. 准备工作 首先需要准备一个 Java 开发环境,推荐使用 Eclipse 或者 IntelliJ IDEA。其次需要下载相应的依赖包,我这里使用的是 opencc4j 库,可以在 Maven 中进行下载。 2. 创建 Java 项目并导入 opencc4j 库 首先在 Eclipse 中创…

    Java 2023年5月20日
    00
  • Nginx为Tomcat服务器作反向代理的配置教程

    下面是关于如何配置Nginx作为Tomcat反向代理的攻略: 步骤1:安装Nginx和Tomcat 首先,你需要在服务器上安装两个软件:Nginx 和 Tomcat。 Nginx可以通过源码编译或者使用包管理器安装。在 Ubuntu 上,你可以通过以下命令安装: sudo apt-get update sudo apt-get install nginx T…

    Java 2023年5月20日
    00
  • SpringMVC视图作用详解

    以下是关于“SpringMVC视图作用详解”的完整攻略,其中包含两个示例。 1. 前言 SpringMVC是一种常用Java Web开发框架,其核心思想是基于MVC模式来实现Web应用程序开发。而视图是SpringMVC框架的一个重要组成部分,负责将模型数据渲染成HTML页面并返回给客户端。本攻略将详细讲解SpringMVC视图的作用和使用方法。 2. Sp…

    Java 2023年5月16日
    00
  • java反射超详细讲解

    Java反射超详细讲解 什么是Java反射 Java反射(Reflection)是指在程序运行时,可以对一个类进行解剖,获取到类的所有信息,包括类名、父类、接口、变量、方法等,并能够访问和操作对象的属性和方法。 正常情况下,我们在使用Java开发时,需要先编写好类,并通过该类生成对象,然后才能使用该对象的属性和方法。但是,当我们使用反射技术时,我们可以在不编…

    Java 2023年5月25日
    00
  • 如何进行Java代码混淆?

    下面是Java代码混淆的完整使用攻略: 什么是代码混淆? 代码混淆是一种技术,用于在不改变代码功能的情况下,通过改变代码的结构和逻辑,使之变得更难理解和分析,从而增加反向工程的难度。 为什么要进行代码混淆? 在Java应用程序中,代码是以明文形式存在的。如果黑客轻易地分析出加密算法,则攻击者可以使用相同的算法和密钥来破解系统。因此,代码混淆是为了增加系统的安…

    Java 2023年5月11日
    00
  • 详解SpringBoot定时任务说明

    下面我来详细讲解一下“详解SpringBoot定时任务说明”的完整攻略。 什么是SpringBoot定时任务? SpringBoot定时任务是指在特定的时间或周期性的执行一些任务,比如定时生成报表、清理数据库等。SpringBoot框架中提供了丰富的定时任务支持,可以通过简单的配置来实现这些任务。 定时任务的实现方式 基于注解和功能接口实现定时任务 Spri…

    Java 2023年5月19日
    00
  • String类型转localDate,date转localDate的实现代码

    首先,我们需要了解Java中日期类型的概念。在Java 8之前,我们通常使用java.util.Date类来处理日期,但是这个类在很多方面都存在问题。因此,在Java 8 中引入了java.time包,提供了全新的日期和时间API,其中LocalDate是处理日期的主要类之一。 String类型转LocalDate 将String类型转换为LocalDate…

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