ホームページ  >  記事  >  バックエンド開発  >  JSON をエンコードおよびデコードするときに、Go で []byte フィールドをどのように処理しますか?

JSON をエンコードおよびデコードするときに、Go で []byte フィールドをどのように処理しますか?

DDD
DDDオリジナル
2024-11-06 15:07:02344ブラウズ

How do you handle []byte fields in Go when encoding and decoding JSON?

Go で []byte フィールドを使用した JSON のエンコードとデコード

Go では、多くの場合、JSON データを操作してデータ構造をエンコードおよびデコードする必要があります。 JSON形式から。 []byte フィールドとして表される文字列を JSON にシリアル化しようとすると、一般的なシナリオが 1 つ発生します。

json.Marshal() による Base64 変換

デフォルトでは、json .Marshal() メソッドは []byte フィールドを特別に扱います。それらを生のバイトとしてシリアル化する代わりに、base64 でエンコードされた文字列としてエンコードします。 JSON にはバイナリ データのネイティブ表現がないため、この変換が必要です。

予想される出力からの逸脱

この動作を説明するために、次のコード スニペットを検討してください。

<code class="go">package main

import (
    "fmt"
    "encoding/json"
)

type Msg struct {
    Content []byte
}

func main() {
    helloStr := "Hello"
    helloSlc := []byte(helloStr)
    fmt.Println(helloStr, helloSlc)

    obj := Msg{helloSlc}
    json, _ := json.Marshal(obj)
    fmt.Println(string(json))
}</code>

出力:

Hello [72 101 108 108 111]
{"Content":"SGVsbG8="}

ご覧のとおり、 JSON 文字列には、元の文字列自体ではなく、base64 でエンコードされたバージョンの「Hello」文字列が含まれています。

変換について

この動作の理由は根本的なものですJSON 仕様には生のバイトのネイティブ表現がありません。 []byte フィールドを Base64 エンコードすることで、json.Marshal() は元のデータの整合性を維持しながら JSON 形式との互換性を確保します。

カスタム エンコーディングの処理

base64 エンコードではなく生のバイトを保存したい場合は、カスタムのシリアル化および逆シリアル化ロジックを実装できます。これには通常、構造体の MarshalJSON() メソッドと UnmarshalJSON() メソッドのオーバーライドが含まれます。

カスタム マーシャリングの例:

<code class="go">func (m *Msg) MarshalJSON() ([]byte, error) {
    type Alias Msg
    return json.Marshal((*Alias)(m))
}</code>
<code class="go">func (m *Msg) UnmarshalJSON(b []byte) error {
    type Alias Msg
    var a Alias
    if err := json.Unmarshal(b, &a); err != nil {
        return err
    }
    *m = Msg(a)
    return nil
}</code>

以上がJSON をエンコードおよびデコードするときに、Go で []byte フィールドをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。