ホームページ > バックエンド開発 > Golang > json.Marshal が json.RawMessage を Base64 としてエンコードするのはなぜですか?

json.Marshal が json.RawMessage を Base64 としてエンコードするのはなぜですか?

DDD
リリース: 2024-11-08 21:40:02
オリジナル
977 人が閲覧しました

Why Does json.Marshal Encode json.RawMessage as Base64?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート