json.RawMessage を使用した json.Marshal が Base64 でエンコードされた文字列を返すのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-12 08:04:02
オリジナル
500 人が閲覧しました

Why does json.Marshal with json.RawMessage return a Base64 encoded string?

json.RawMessage をマーシャリングすると Base64 エンコードされた文字列が返される

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

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