Heim  >  Artikel  >  Backend-Entwicklung  >  Warum gibt json.Marshal mit json.RawMessage eine Base64-codierte Zeichenfolge zurück?

Warum gibt json.Marshal mit json.RawMessage eine Base64-codierte Zeichenfolge zurück?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-12 08:04:02491Durchsuche

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

Marshalling von json.RawMessage gibt Base64-codierte Zeichenfolge zurück

Beim Aufruf von json.Marshal mit einem json.RawMessage-Wert ist das Ergebnis unerwartet. Anstelle des gewünschten JSON-Strings wird ein Base64-codierter String zurückgegeben.

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=="
}

Das Problem liegt in der Verwendung von json.RawMessage in json.Marshal. Der Typ json.RawMessage, der zum Speichern von JSON-Rohdaten ohne Decodierung entwickelt wurde, verfügt über eine MarshalJSON-Methode, die einfach das Byte-Slice zurückgibt.

func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil
}

Damit json.Marshal jedoch ordnungsgemäß mit json.RawMessage funktioniert, Der übergebene Wert muss ein Zeiger auf die json.RawMessage-Instanz sein.

j, err := json.Marshal(&raw)

Durch die Übergabe eines Zeigers an json.RawMessage wird die MarshalJSON-Methode auf dem Zeiger aufgerufen, um sicherzustellen, dass das Byte-Slice ohne Base64 zurückgegeben wird Kodierung.

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"}"
}

Das obige ist der detaillierte Inhalt vonWarum gibt json.Marshal mit json.RawMessage eine Base64-codierte Zeichenfolge zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn