ホームページ >バックエンド開発 >Golang >Go []byte を JSON マーシャリングすると Base64 でエンコードされた文字列が生成されるのはなぜですか?

Go []byte を JSON マーシャリングすると Base64 でエンコードされた文字列が生成されるのはなぜですか?

DDD
DDDオリジナル
2024-12-07 02:46:15212ブラウズ

Why Does JSON Marshaling of a Go []byte Result in a Base64-Encoded String?

[]byte を JSON にマーシャリングする: 謎を解読する

バイト スライス ([]byte) を JSON 形式にマーシャリングしようとすると、出力として奇妙なエンコードされた文字列が表示されることはよくあります。この独特の動作を詳しく調べるために、質問で提供されているコード サンプルを調べてみましょう。

type ColorGroup struct {
    ByteSlice    []byte
    SingleByte   byte
    IntSlice     []int
}
...
b, err := json.Marshal(group)

JSON マーシャリング プロセスは、Go データ構造を JSON 表現に変換します。この変換中に []byte がどのように処理されるかを理解することが重要です。 json.Marshal の Go ドキュメントによると、「[]byte は、base64 でエンコードされた文字列としてエンコードされます。」

エンコーディングの謎

これが意味するのは、 [] バイトを JSON にマーシャリングしようとすると、スライスは JSON 出力に配列として直接含まれません。代わりに、base64 でエンコードされた文字列に変換されます。 JSON にはネイティブのバイト スライス タイプがないため、この変換が使用されます。

エンコードされた文字列のデコード

エンコードされた文字列を元のバイト スライスにデコードするには、次のようにします。 Goのbase64パッケージを使用できます。

import (
    "encoding/base64"
    "log"
)
...
b64 := "AAAAAQID" // encoded byte slice from JSON
b, err := base64.StdEncoding.DecodeString(b64)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%v", b) // Outputs: [0 0 0 1 2 3]

なぜ奇妙な文字列なのか?

見つかったエンコードされた文字列は、base64 エンコード プロセスの結果です。 Base64 エンコードは、バイナリ データを ASCII 文字のサブセットに置き換えて、JSON などの非バイナリ形式での送信または保存に適したものにします。バイト スライスの場合、このエンコーディングはバイト値を文字列表現に変換します。

以上がGo []byte を JSON マーシャリングすると Base64 でエンコードされた文字列が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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