[]byte を JSON にマーシャリングする: 文字列表現を理解する
[]byte 値を JSON 形式にマーシャリングしようとすると、特有の問題が発生する可能性があります。元の質問で強調表示されているものと同様の文字列出力。この記事では、[]byte を JSON に正しくマーシャリングする方法と、出力が観察された文字列に変換される理由という謎の両面について説明します。
解決策: []byte を JSON にマーシャリングする
json.Marshal の Golang の公式ドキュメントによると、配列とスライスの値は JSON 配列としてエンコードされます。このルールの例外は []byte スライスに適用され、特に Base64 エンコード文字列としてエンコードされます。逆に、nil スライスは null JSON オブジェクトとしてエンコードされます。
したがって、[]byte を JSON に正確にマーシャリングするには、マーシャリング プロセス中に、base64 でエンコードされた文字列として明示的にキャストする必要があります。
理由: [] バイトの Base64 エンコーディング
元の質問の出力で観察された動作は、JSON の []byte スライスに使用されるエンコード メカニズムの直接の結果です。 JSON は生のバイト スライスをネイティブに表現できません。したがって、それらはbase64でエンコードされた文字列に変換されます。 Base64 エンコードでは、バイナリ データを文字列として表現できるため、JSON などのテキストベースの形式での送信や保存に適しています。
たとえば、出力に表示される文字列「AAAAAQID」は、base64 を表します。 [] バイト スライス [0, 0, 0, 1, 2, 3] のエンコードされたバージョン。
元のバイト スライスを取得するにはBase64 表現では、以下のコードに示すように、base64.StdEncoding.DecodeString 関数を使用できます。
import "encoding/base64" func decodeBase64(encodedString string) ([]byte, error) { return base64.StdEncoding.DecodeString(encodedString) }
結論
[] バイトを JSON にマーシャリングするこれは、バイナリ データをテキスト ベースの形式で表現する必要性に基づいて行われる手法です。このエンコード メカニズムを理解すると、マーシャリング プロセス中に発生する一見奇妙な文字列出力をわかりやすく理解するのに役立ちます。
以上が[]byte を JSON にマーシャリングすると Base64 でエンコードされた文字列が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。