json.RawMessage 値を指定して json.Marshal を呼び出すと、予期しない結果が返されます。目的の JSON 文字列の代わりに、base64 でエンコードされた文字列が返されます。
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)) // Output: "eyJmb28iOiJiYXIifQ==" }
問題は、json.Marshal での json.RawMessage の使用にあります。 json.RawMessage タイプは、生の JSON データをデコードせずに保存するように設計されており、単純にバイト スライスを返す MarshalJSON メソッドを備えています。
func (m *RawMessage) MarshalJSON() ([]byte, error) { return *m, nil }
ただし、json.Marshal が json.RawMessage で正しく機能するには、渡される値は、json.RawMessage インスタンスへのポインターである必要があります。
j, err := json.Marshal(&raw)
json.RawMessage へのポインターを渡すことにより、MarshalJSON メソッドがポインターに対して呼び出され、base64 なしでバイト スライスが返されることが保証されます。エンコーディング。
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)) // Output: "{"foo":"bar"}" }
以上がjson.RawMessage を使用した json.Marshal が Base64 でエンコードされた文字列を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。