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