Protobuf轉JSON詳解

一、Protobuf轉JSON原理

Protobuf(Protocol Buffer)是一種輕便高效的數據交換格式,通常用於網路通信或數據存儲。 JSON(JavaScript Object Notation)則是一種輕量級的數據交換格式,易於閱讀和編寫。在有些情況下,我們需要將Protobuf格式轉換為JSON格式。

Protobuf轉JSON的原理比較簡單,就是通過解析Protobuf格式的數據,按照一定格式生成對應的JSON字元串。這個過程可以手寫代碼實現,也可以使用現有的工具和庫來完成。

二、Protobuf轉JSON工具

在實際開發中,我們通常使用現有的工具和庫來完成Protobuf轉JSON的過程,減少我們手寫代碼的時間和工作量。以下是一些常用的Protobuf轉JSON工具。

1. protoc-gen-json

protoc-gen-json是一個基於protobuf文件的JSON生成器插件,可將protobuf文件轉為JSON格式。它是protobuf官方提供的一款插件工具,需要通過protoc編譯器來使用。

使用方法:

    
    // 安裝插件
    go get -u github.com/mitchellh/protoc-gen-json

    // 編譯protobuf文件,生成對應的json文件
    protoc --json_out=./output/ ./yourprotofile.proto 
    

2. protobuf-json

protobuf-json是一個Java庫,提供了將protobuf格式轉為JSON格式的功能。這個庫提供了一些註解和反序列化特性,方便用戶進行開發。

使用方法:

    
    // 添加依賴
    compile 'com.github.jinahya:protobuf-json:0.2.1'

    // 編寫代碼
    ProtobufJson protbufJson = new ProtobufJson();
    YourMessage protoMessage = YourMessage.parseFrom(json.getBytes());
    String jsonString = protbufJson.toString(protoMessage);
    

三、Protobuf轉JSON在線工具

除了本地工具外,還有很多在線工具可以用來轉換Protobuf格式到JSON格式。以下是一些常用的在線工具。

1. Protobuf.js

Protobuf.js提供了將protobuf數據轉換為JSON格式的功能,並支持JSON導入到protobuf格式的功能。它是一個流行的JavaScript庫,有一些常用的API來處理Protobuf數據。

使用方法:

    
    // 安裝依賴
    npm install protobufjs

    // 引入protobufjs庫
    import protobuf from "protobufjs";

    // 編寫代碼
    var myMessage = MyMessage.decode(data);
    var jsonString = JSON.stringify(myMessage);
    

2. Proto2Json

Proto2Json是一個在線工具,可以將Protobuf格式的數據轉換為JSON格式。 它提供了一個簡單的Web界面,只需上傳Protobuf文件即可生成JSON數據。

使用方法:訪問https://proto2json.com/

四、Protobuf轉JSON代碼解析

在進行Protobuf轉JSON時,我們需要明確兩種數據結構的差異。Protobuf數據結構是二進位的、緊湊的,而JSON數據結構是文本的、易於閱讀的。因此,在將Protobuf數據轉為JSON時,我們需要進行一些格式化操作。

以下是一個示例的Protobuf結構體:

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

以下是其對應的JSON字元串:

    
    {
       "name": "John",
       "id": 1234,
       "email": "john@mycompany.com"
    }
    

我們可以發現,在將Protobuf格式數據轉換為JSON數據時,需要進行三個方面的處理:欄位名、值類型、嵌套結構。

在欄位名方面,首先需要注意的是,Protobuf的欄位名是以下劃線開頭的,而在JSON中,通常是以駝峰式命名的。因此在進行轉換時,需要將下劃線去除,並將後面的字母轉為大寫。

在值類型方面,Protobuf支持的類型較多,包括int、string、float等。在轉為JSON時,需要將它們對應到JSON的數據類型,比如int應該轉為Number類型,float應該轉為Decimal類型。在轉換時,還需要注意一些特殊的數據類型,比如枚舉類型、嵌套結構類型等,需要在轉換時進行特殊處理。

在嵌套結構方面,Protobuf支持嵌套結構,即一個消息中可以包含其他消息。在將Protobuf轉為JSON時,需要將這些嵌套結構進行遞歸處理,將它們轉為對應的JSON格式。

以下是一個完整的Protobuf轉JSON代碼示例:

    
    // 定義Person結構體
    syntax = "proto3";

    message Person {
      string name = 1;
      int32 id = 2;
      string email = 3;
    }

    // 定義Main函數
    public class Main {
      public static void main(String[] args) {

        Person person = Person.newBuilder()
          .setName("John")
          .setId(1234)
          .setEmail("john@mycompany.com")
          .build();

        // 將Protobuf格式轉為JSON格式
        JsonObject jsonPerson = JsonParser
          .parseString(JsonFormat.printer().print(person))
          .getAsJsonObject();

        // 獲取JSON字元串
        String jsonString = jsonPerson.toString();

        System.out.println(jsonString);
      }
    }
    

五、Protobuf轉JSON Bytes類型

除了直接將Protobuf轉為JSON格式外,我們還可以將Protobuf轉為Bytes類型,再將Bytes類型轉為JSON格式。

以下是一個示例代碼:

    
    // 定義Person結構體
    syntax = "proto3";

    message Person {
      string name = 1;
      int32 id = 2;
      string email = 3;
    }

    // 定義Main函數
    public class Main {
      public static void main(String[] args) {

        Person person = Person.newBuilder()
          .setName("John")
          .setId(1234)
          .setEmail("john@mycompany.com")
          .build();

        // 將Protobuf格式轉為Bytes格式
        ByteString bytesPerson = person.toByteString();

        // 將Bytes格式轉為JSON格式
        String jsonPerson = JsonFormat
          .printer()
          .includingDefaultValueFields()
          .print(JsonFormat.parser().merge(bytesPerson.toStringUtf8()));

        System.out.println(jsonPerson);
      }
    }
    

六、Protobuf轉JSON效率太差

在一些情況下,使用Protobuf轉JSON的效率可能比較低。這是因為,Protobuf是一種緊湊的二進位格式,而JSON是一種文本格式,它們的存儲方式和解析方式不同。

然而,在實際應用中,我們通常不會頻繁地進行Protobuf轉JSON。在網路傳輸和數據存儲等場景中,我們可以將數據直接存儲為Protobuf格式,然後在需要時再進行解析和轉換。

七、Protobuf轉JSON欄位少了下劃線

在進行Protobuf轉JSON時,有時會發現一些欄位少了下劃線,這是因為Javasript生成的JSON格式默認將有下劃線的欄位轉為駝峰式命名,例如:

    
    // 定義Person結構體
    syntax = "proto3";

    message Person {
      string first_name = 1;
      string last_name = 2;
    }
    

將其轉換為JSON格式時,會變為:

    
    {
      "firstName": "John",
      "lastName": "Doe"
    }
    

如果需要按照原來的欄位名進行轉換,可以使用JsonFormat.Option的包含下劃線選項,如下所示:

    
    // 定義Main函數
    public class Main {
      public static void main(String[] args) {

        Person person = Person.newBuilder()
          .setFirstName("John")
          .setLastName("Doe")
          .build();

        // 將Protobuf格式轉為JSON格式
        JsonFormat.Printer printer = JsonFormat.printer()
            .includingDefaultValueFields()
            .omittingInsignificantWhitespace()
            .preservingProtoFieldNames();

        String json = printer.print(person);
        System.out.println(json);
      }
    }
    

以上就是整個Protobuf轉JSON過程及相關問題解析的詳細介紹。在實際開發中,可以根據不同的需求選擇合適的工具和方法進行處理。

原創文章,作者:GZVIY,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/316175.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GZVIY的頭像GZVIY
上一篇 2025-01-09 12:14
下一篇 2025-01-09 12:14

相關推薦

  • JSON的MD5

    在Web開發過程中,JSON(JavaScript Object Notation)是最常用的數據格式之一。MD5(Message-Digest Algorithm 5)是一種常用…

    編程 2025-04-29
  • 使用Java將JSON寫入HDFS

    本篇文章將從以下幾個方面詳細闡述Java將JSON寫入HDFS的方法: 一、HDFS簡介 首先,先來了解一下Hadoop分散式文件系統(HDFS)。HDFS是一個可擴展性高的分散式…

    編程 2025-04-29
  • 如何使用Newtonsoft datatable轉Json

    Newtonsoft DataTable 是一個基於.NET的JSON框架,也是一個用於序列化和反序列化JSON的強大工具。 在本文中,我們將學習如何使用Newtonsoft Da…

    編程 2025-04-28
  • JPRC – 輕鬆創建可讀性強的 JSON API

    本文將介紹一個全新的 JSON API 框架 JPRC,通過該框架,您可以輕鬆創建可讀性強的 JSON API,提高您的項目開發效率和代碼可維護性。接下來將從以下幾個方面對 JPR…

    編程 2025-04-27
  • Python存為JSON的方法及實例

    本文將從以下多個方面對Python存為JSON做詳細的闡述。 一、JSON簡介 JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,易於人閱…

    編程 2025-04-27
  • 使用Python獲取JSON並解析

    本文將介紹如何使用Python獲取JSON數據並解析相關內容。通過使用Python的第三方庫,我們可以輕鬆地處理JSON數據,包括讀取、提取和操作JSON數據。 一、獲取JSON數…

    編程 2025-04-27
  • 使用Spread 8展示JSON數據

    使用Spread 8可以方便地展示JSON數據,本文將詳細介紹如何利用Spread 8展示JSON數據。 一、Spread 8簡介 Spread 8是一款強大的電子表格軟體,可以方…

    編程 2025-04-27
  • 如何在json轉實體類時忽略大小寫

    本文將從以下幾個方面介紹如何在json轉實體類時忽略大小寫。 一、使用Gson庫實現json轉實體類忽略大小寫 Gson是Google提供的Java JSON操作庫,它提供了簡單易…

    編程 2025-04-27
  • C# 中 JSON null 不顯示的處理方法

    本文將為大家介紹在 C# 中處理 JSON null 不顯示的解決方法。 一、null 不顯示的問題 在使用 C# 進行 JSON 數據處理的時候,經常會遇到 null 值不顯示的…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25

發表回復

登錄後才能評論