json、xml、protobuf の Golang 関数のエンコードおよびデコード方法

王林
リリース: 2023-05-18 08:00:24
オリジナル
1392 人が閲覧しました

Golang は、ネットワーク アプリケーションの開発で広く使用されているオープン ソース プログラミング言語です。 Golang では、豊富な関数ライブラリを提供するだけでなく、json、xml、protobuf などのさまざまなエンコードおよびデコード方法も提供します。この記事では、Golang関数のjson、xml、protobufのエンコード・デコード方法とその使い方を紹介します。

1. json のエンコードとデコード

1.1 エンコード

Golang では、構造を json 形式にエンコードするのは非常に簡単です。 json パッケージの Marshal 関数を使用して、構造を json データにエンコードするだけです。

たとえば、次のような構造があります:

type Student struct {
    Name    string `json:"name"`
    Age     int    `json:"age"`
    Address string `json:"address"`
}
ログイン後にコピー

この構造を json 形式にエンコードしたい場合は、次のように実行できます:

s := Student{
    Name:    "张三",
    Age:     18,
    Address: "北京市朝阳区",
}
b, err := json.Marshal(s)
if err != nil {
    //错误处理
}
fmt.Println(string(b))
ログイン後にコピー

出力 json 形式:

{
    "name": "张三",
    "age": 18,
    "address": "北京市朝阳区"
}
ログイン後にコピー

1.2 デコード

同様に、json パッケージの Unmarshal 関数を使用して、json データを構造体にデコードすることも非常に簡単です。 json データを Unmarshal 関数に渡すだけです。

たとえば、次の json データがあります:

data := `{
    "name": "李四",
    "age": 20,
    "address": "上海市浦东新区"
}`
ログイン後にコピー

この json データを構造体にデコードしたい場合は、次のように実行できます:

var s Student
err := json.Unmarshal([]byte(data), &s)
if err != nil {
    //错误处理
}
fmt.Println(s.Name, s.Age, s.Address)
ログイン後にコピー

出力結果は:

李四 20 上海市浦东新区
ログイン後にコピー
ログイン後にコピー

2. XML エンコードとデコード

2.1 エンコード

Golang では、構造を XML 形式にエンコードすることもできます。エンコーディング/xml パッケージの Marshal 関数を使用するだけです。

たとえば、次のような構造があります:

type Student struct {
    Name    string `xml:"name"`
    Age     int    `xml:"age"`
    Address string `xml:"address"`
}
ログイン後にコピー

この構造を XML 形式にエンコードしたい場合は、次のように実行できます:

s := Student{
    Name:    "张三",
    Age:     18,
    Address: "北京市朝阳区",
}
b, err := xml.Marshal(s)
if err != nil {
    //错误处理
}
fmt.Println(string(b))
ログイン後にコピー

Output xml format As

<Student>
    <name>张三</name>
    <age>18</age>
    <address>北京市朝阳区</address>
</Student>
ログイン後にコピー

2.2 デコード

同様に、encoding/xml パッケージの Unmarshal 関数を使用して XML データを構造体にデコードすることも非常に簡単です。 XML データを Unmarshal 関数に渡すだけです。

たとえば、次の XML データがあります:

data := `
<Student>
    <name>李四</name>
    <age>20</age>
    <address>上海市浦东新区</address>
</Student>`
ログイン後にコピー

この XML データを構造体にデコードしたい場合は、次のように実行できます:

var s Student
err := xml.Unmarshal([]byte(data), &s)
if err != nil {
    //错误处理
}
fmt.Println(s.Name, s.Age, s.Address)
ログイン後にコピー

出力結果

李四 20 上海市浦东新区
ログイン後にコピー
ログイン後にコピー

3. protobuf のエンコードとデコード

3.1 protobuf のインストール

protobuf のエンコードとデコードの前に、最初に protobuf をインストールする必要があります。インストール方法は次のとおりです。

  1. protobuf インストール ファイルをダウンロードします。ダウンロード アドレス: https://github.com/protocolbuffers/protobuf/releases
  2. インストール ファイルを解凍し、解凍されたディレクトリに移動します。
  3. 次のコマンドを実行して protobuf をインストールします:
./configure
make
make check
sudo make install
sudo ldconfig
ログイン後にコピー
  1. protobuf が正常にインストールされているかどうかを確認します:
protoc --version
ログイン後にコピー

次のような情報がある場合が出力されます。protobuf が正常にインストールされたことを示してください:

libprotoc 3.6.1
ログイン後にコピー

3.2 protobuf ファイルの書き込み

protobuf のエンコードとデコードの前に、protobuf ファイルを作成する必要があります。 protobuf ファイルでは、メッセージ タイプを定義し、各フィールドにタグを割り当てる必要があります。

たとえば、protobuf ファイルは次のように記述します。

syntax = "proto3";
package main;

message Student {
    string name = 1;
    int32 age    = 2;
    string address = 3;
}
ログイン後にコピー

protobuf では、tag は各フィールドを識別するために使用される整数値です。この例では、名前フィールドは 1 に設定され、年齢フィールドは 2 に設定され、住所フィールドは 3 に設定されます。

3.3 コーディング

Golang では、protobuf を使用したコーディングは非常に簡単です。 protobuf パッケージの Marshal 関数を使用するだけです。

たとえば、次のような構造があります:

s := &pb.Student{
    Name:    "张三",
    Age:     18,
    Address: "北京市朝阳区",
}
b, err := proto.Marshal(s)
if err != nil {
    //错误处理
}
fmt.Println(string(b))
ログイン後にコピー

出力 protobuf エンコーディングは次のとおりです:

1:6
2:18
3:"北京市朝阳区"
ログイン後にコピー

3.4 デコード

同様に、 protobuf パッケージ protobuf データを構造体にデコードする Unmarshal 関数も非常に簡単です。 protobuf データとメッセージ タイプを Unmarshal 関数に渡すだけです。

たとえば、次の protobuf データがあります:

data := []byte{0x0a, 0x06, 0xe5, 0xbc, 0xa0, 0xe4, 0xb8, 0x89, 0x10, 0x12, 0x0f, 0xe5, 0x8c, 0x97, 0xe4, 0xba, 0xac, 0xe5, 0x9b, 0xbd, 0xe5, 0x8c, 0x9d, 0xe5, 0x8c, 0x97, 0xe5, 0x8c, 0x80, 0x1a, 0x0d, 0xe5, 0x8c, 0x97, 0xe4, 0xba, 0xac, 0xe5, 0x9b, 0xbd, 0xe5, 0x8c, 0x9d}
ログイン後にコピー

この protobuf データを構造体にデコードしたい場合は、次のように実行できます:

var s pb.Student
err := proto.Unmarshal(data, &s)
if err != nil {
    //错误处理
}
fmt.Println(s.Name, s.Age, s.Address)
ログイン後にコピー

出力結果

张三 18 北京市朝阳区
ログイン後にコピー

概要

Golang では、さまざまなシナリオのニーズを満たすために、さまざまなエンコードおよびデコード方法が提供されています。 json のエンコードとデコード、xml のエンコードとデコード、protobuf のエンコードとデコードは、一般的に使用されるエンコードとデコードの方法であり、幅広い適用性があります。これらのコーデックをマスターすると、ネットワーク アプリケーションの開発がより簡単になります。

以上がjson、xml、protobuf の Golang 関数のエンコードおよびデコード方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート