知識庫 / JSON RSS 訂閱

JSON 與 Protobuf 互換

JSON
HongKong
9
09:49 PM · Dec 05 ,2025

1. 概述

在本教程中,我們將演示如何將 JSON 轉換為 Protobuf 以及從 Protobuf 轉換為 JSON。

Protobuf 是一種免費且開源的跨平台數據格式,用於 序列化 結構化數據。

2. Maven 依賴

為了開始,讓我們通過添加 protobuf-java-util 依賴項創建一個 Spring Boot 項目:

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
    <version>3.25.3</version>
</dependency>

3. 將 JSON 轉換為 Protobuf 協議緩衝區

我們可以使用 JsonFormat 將 JSON 轉換為 Protobuf 消息。 JsonFormat 是一個用於將 Protobuf 消息轉換為/從 JSON 格式的實用工具類。 JsonFormat’s parser() 創建一個 Parser,它使用 merge() 方法解析 JSON 到 Protobuf 消息。

讓我們創建一個方法,該方法接受 JSON 並生成 Protobuf 消息:

public static Message fromJson(String json) throws IOException {
    Builder structBuilder = Struct.newBuilder();
    JsonFormat.parser().ignoringUnknownFields().merge(json, structBuilder);
    return structBuilder.build();
}

讓我們使用以下示例 JSON:

{
    "boolean": true,
    "color": "gold",
    "object": {
      "a": "b",
      "c": "d"
    },
    "string": "Hello World"
}

現在,讓我們編寫一個簡單的測試,以驗證從 JSON 到 protobuf 消息的轉換:

@Test
public void givenJson_convertToProtobuf() throws IOException {
    Message protobuf = ProtobufUtil.fromJson(jsonStr);
    Assert.assertTrue(protobuf.toString().contains("key: \"boolean\""));
    Assert.assertTrue(protobuf.toString().contains("string_value: \"Hello World\""));
}

4. 將 Protobuf 轉換為 JSON

我們可以使用 JsonFormat 類的 printer() 方法將 Protobuf 消息轉換為 JSON。該方法接受 Protobuf 作為 MessageOrBuilder

public static String toJson(MessageOrBuilder messageOrBuilder) throws IOException {
    return JsonFormat.printer().print(messageOrBuilder);
}

讓我們編寫一個簡單的測試,以驗證從 protobuf 到 JSON 消息的轉換:

@Test
public void givenProtobuf_convertToJson() throws IOException {
    Message protobuf = ProtobufUtil.fromJson(jsonStr);
    String json = ProtobufUtil.toJson(protobuf);
    Assert.assertTrue(json.contains("\"boolean\": true"));
    Assert.assertTrue(json.contains("\"string\": \"Hello World\""));
    Assert.assertTrue(json.contains("\"color\": \"gold\""));
}

5. 結論

在本文中,我們演示瞭如何將 JSON 轉換為 protobuf 以及反之。

發佈 評論

Some HTML is okay.