json.RawMessage のマーシャリング: Base64 エンコーディングの背後にある理由を明らかにする
この興味深いシナリオでは、次のことを試みているときに異常な動作に遭遇しました。 json.RawMessage インスタンスをマーシャリングします。驚くべきことに、予期されたエンコードされていない JSON 文字列を取得する代わりに、細心の注意を払って Base64 でエンコードされたバージョンが得られました。この謎を解決するために、基礎となる仕組みを詳しく調べてみましょう。
json.RawMessage で Marshal 関数を使用する場合、重要な要素は入力値が確実に含まれるようにすることにあることを認識することが重要です。実際はポインタです。この一見微妙な違いは、json.RawMessage.
の動作において極めて重要な役割を果たします。あなたが正しく指摘したように、json.RawMessage の MarshalJSON の実装は、単純に基礎となるバイト スライスを返すように設計されています。ただし、入力値がポインタでない場合、マーシャル関数は、バイト スライスを出力する前に、自動的に Base64 エンコーディングをバイト スライスに適用します。
この状況を修正して望ましい結果を得るには、解決策は次のように渡すだけです。 json.RawMessage へのポインター。そうすることで、基になるバイト スライスを直接操作するようにマーシャル関数に効果的に指示し、望ましくない Base64 エンコード プロセスをバイパスします。
次の変更されたコード スニペットを考えてみましょう。
package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMessage(`{"foo":"bar"}`) j, err := json.Marshal(&raw) // Pass a pointer to json.RawMessage if err != nil { panic(err) } fmt.Println(string(j)) }
Byこの微妙だが重要な変更を実装することで、期待される結果を自信を持って予測できるようになりました。
{"foo":"bar"}
この変更されたコードは、マーシャル関数のポインターベースの入力値の要件に沿っており、不要な Base64 エンコーディングを効果的に排除します。この新たに得た知識を武器に、同様の課題に自信を持って取り組み、Go アプリケーションで望ましい JSON マーシャリング動作を確保できるようになります。
以上が私の「json.RawMessage」が Base64 としてマーシャルされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。