2016-04-07 12 views
4

Ich habe eine Struktur, die Zeichenfolgen als [] Bytefelder enthält, die ich in JSON codieren möchte. Der generierte JSON enthält jedoch eine nicht erwartete Stringdarstellung des Slice-Inhalts. Hier ist ein Beispiel dafür, was ich verweisen:Marshaling JSON [] Byte als Zeichenfolgen in Go

package main 

import (
    "fmt" 
    "encoding/json" 
    ) 

type Msg struct { 
    Content []byte 
} 

func main() { 
    helloStr := "Hello" 
    helloSlc := []byte(helloStr) 
    fmt.Println(helloStr, helloSlc) 

    obj := Msg{helloSlc} 
    json, _ := json.Marshal(obj) 
    fmt.Println(string(json)) 
} 

Dies erzeugt die folgende Ausgabe:

Hello [72 101 108 108 111] 
{"Content":"SGVsbG8="} 

Welche Umwandlung ist die json.Marshal() Durchführung dieses Verfahrens auf die [] Byte codierte Zeichenfolge. Wie kann ich ein JSON mit dem ursprünglichen Inhalt meines Strings {"Content": "Hello"} generieren?

Antwort

6

Ein []byte wird als base64-codierte Zeichenfolge gemarshallt. Vom documentation:

Array und slice Werte codieren als JSON Arrays, außer dass []byte als Base64-codierten String codiert, und eine nil slice codiert als null JSON Objekt.

Diese Werte werden beim Entpacken korrekt decodiert.

Der Grund warum dies getan wird, ist, dass JSON keine native Darstellung für rohe Bytes hat. Eine detaillierte Erklärung finden Sie unter this question.

+0

Also, ich denke, die einzige Möglichkeit, meine JSON richtig zu formatieren wäre, das [] Byte in eine Zeichenkette vor der Kodierung zu werfen. Oder gibt es einen besseren Ansatz für dieses Problem? – MonkeyButter

+3

Ihr JSON ist richtig formatiert. Dieses Verhalten ist kein Fehler und beabsichtigt. Wenn Sie eine String-Repräsentation haben wollen und nur mit Text arbeiten wollen, verwenden Sie 'string' anstelle von' [] byte'. – nemo

Verwandte Themen