Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kodiert json.Marshal json.RawMessage als Base64?

Warum kodiert json.Marshal json.RawMessage als Base64?

DDD
DDDOriginal
2024-11-08 21:40:02912Durchsuche

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

Marshalling von json.RawMessage: Base64-Kodierung entschlüsseln

Beim Versuch, ein json.RawMessage-Objekt zu marshallieren, stoßen Sie möglicherweise auf eine unerwartete Base64-Kodierung string anstelle des gewünschten JSON-Strings als Ausgabe. Um dieses Verhalten zu entschlüsseln, werfen wir einen Blick auf das zugrunde liegende Konzept.

json.RawMessage ist, wie der Name schon sagt, darauf ausgelegt, JSON-Rohdaten als Byte-Slice zu verarbeiten. Wenn Sie versuchen, eine RawMessage mit json.Marshal zu Marshallen, besteht das Standardverhalten darin, sie so zu codieren, als wäre sie ein reguläres []Byte. Dies führt zu der von Ihnen beobachteten Base64-Codierung.

Um dies zu umgehen, besteht die Lösung darin, einen Zeiger auf die RawMessage an json.Marshal zu übergeben. Dies liegt daran, dass die MarshalJSON-Methode von RawMessage, die für den Marshalling-Prozess verantwortlich ist, einen Zeiger als Argument erwartet. Ohne den Zeiger kann das Byte-Slice nicht wie vorgesehen korrekt zurückgegeben werden.

Indem Sie Ihren Code so ändern, dass er einen Zeiger übergibt, wie unten gezeigt, erhalten Sie die erwartete JSON-Zeichenfolge als Ausgabe:

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

Ausgabe:

{"foo":"bar"}

Das obige ist der detaillierte Inhalt vonWarum kodiert json.Marshal json.RawMessage als Base64?. 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