Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist meine json.RawMessage base64-codiert, wenn ich „json.Marshal“ verwende?

Warum ist meine json.RawMessage base64-codiert, wenn ich „json.Marshal“ verwende?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-09 06:56:02514Durchsuche

Why is my json.RawMessage being base64 encoded when using `json.Marshal`?

Base64-Kodierungsproblem mit json.Marshal und json.RawMessage

Im bereitgestellten Code wird json.Marshal auf eine json.RawMessage angewendet , das beliebige JSON-Daten darstellen soll. Allerdings ist die Ausgabe unerwarteterweise Base64-codiert.

Problem

Bei der Untersuchung wird deutlich, dass die MarshalJSON-Methode von json.RawMessage einfach das Byte-Slice der Nachricht zurückgibt, als hier zu sehen:

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil 
}

Wenn daher json.Marshal ohne einen Zeiger auf die RawMessage aufgerufen wird, wird es fälschlicherweise als gewöhnliches []Byte behandelt, was zu einer Base64-Codierung führt.

Lösung

Wie im Go-Nuts-Thread vorgeschlagen, besteht die Lösung darin, beim Aufruf von json.Marshal einen Zeiger auf die json.RawMessage bereitzustellen, wie unten gezeigt:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(&raw) // Pass pointer to RawMessage
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  
}

Dieser Ansatz entspricht dem von json.Marshal erwarteten Verhalten, bei dem davon ausgegangen wird, dass Nichtzeiger rohe Bytewerte darstellen. Durch die Bereitstellung eines Zeigers auf RawMessage wird die Nachricht korrekt als JSON-Wert erkannt und entsprechend gerendert.

Das obige ist der detaillierte Inhalt vonWarum ist meine json.RawMessage base64-codiert, wenn ich „json.Marshal“ verwende?. 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