ホームページ >バックエンド開発 >Golang >「json.Marshal」を使用すると、json.RawMessage が Base64 でエンコードされるのはなぜですか?

「json.Marshal」を使用すると、json.RawMessage が Base64 でエンコードされるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-09 06:56:02565ブラウズ

Why is my json.RawMessage being base64 encoded when using `json.Marshal`?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。