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 サイトの他の関連記事を参照してください。