json.Marshal および json.RawMessage の Base64 エンコーディングの問題
提供されたコードでは、json.Marshal が json.RawMessage に適用されます。 、任意の JSON データを表すことを目的としています。ただし、出力は予期せずに Base64 でエンコードされます。
問題
調査すると、json.RawMessage の MarshalJSON メソッドは単にメッセージのバイト スライスを返すだけであることが明らかになりました。ここで見られます:
// MarshalJSON returns *m as the JSON encoding of m. func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
したがって、 json.Marshal が呼び出されるときRawMessage へのポインターがないと、誤って通常の [] バイトとして扱われ、base64 エンコードが行われます。
解決策
ゴーナッツ スレッドで提案されているように、解決策は、次に示すように、json.Marshal を呼び出すときに json.RawMessage へのポインターを提供することにあります。以下:
package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMessage(`{"foo":"bar"}`) j, err := json.Marshal(&raw) // Pass pointer to RawMessage if err != nil { panic(err) } fmt.Println(string(j)) }
このアプローチは、生のバイト値を表すために非ポインターを想定している json.Marshal から予期される動作と一致しています。 RawMessage へのポインターを提供することで、メッセージを JSON 値として正しく認識し、それに応じてレンダリングします。
以上が「json.Marshal」を使用すると、json.RawMessage が Base64 でエンコードされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。