json.RawMessage のマーシャリング: Base64 エンコーディングの解読
json.RawMessage オブジェクトをマーシャリングしようとすると、予期しない Base64 エンコードが発生する可能性があります。目的の JSON 文字列の代わりに文字列を出力として使用します。この動作を解明するために、基礎となる概念を詳しく調べてみましょう。
json.RawMessage は、その名前が示すように、生の JSON データをバイト スライスとして処理するように設計されています。 json.Marshal を使用して RawMessage をマーシャリングしようとすると、デフォルトの動作では、通常の [] バイトであるかのようにエンコードされます。これにより、先ほど確認した Base64 エンコードが行われます。
これを克服する解決策は、RawMessage へのポインタを json.Marshal に渡すことです。これは、マーシャリング プロセスを担当する RawMessage の MarshalJSON メソッドが引数としてポインタを予期しているためです。ポインターがないと、意図したとおりにバイト スライスを正しく返すことができません。
次に示すように、ポインターを渡すようにコードを変更すると、期待される JSON 文字列が出力として取得されます。
package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMessage(`{"foo":"bar"}`) j, err := json.Marshal(&raw) if err != nil { panic(err) } fmt.Println(string(j)) }
出力:
{"foo":"bar"}
以上がjson.Marshal が json.RawMessage を Base64 としてエンコードするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。