ホームページ  >  記事  >  バックエンド開発  >  json.RawMessage を使用した json.Marshal が Base64 でエンコードされた文字列を返すのはなぜですか?

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-12 08:04:02452ブラウズ

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

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