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

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

Nov 06, 2024 pm 03:07 PM

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, &amp;a); err != nil {
        return err
    }
    *m = Msg(a)
    return nil
}</code>
ログイン後にコピー

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

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか? GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか?

See all articles