2016-04-07 7 views
4

JSONにエンコードしたい[]バイトフィールドとして文字列を含む構造体があります。しかし、生成されたJSONには、スライスの内容の期待されない文字列表現が含まれています。ここで私が呼ぶものの一例である:Goで文字列としてJSON []バイトをマーシャリング

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

これは次の出力を生成します。

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

変換はどのような[]バイトエンコードされた文字列に行っjson.Marshal()方法です。私の文字列{"Content": "Hello"}の元のコンテンツを持つJSONをどのように生成できますか?

答えて

6

[]byteは、base64でエンコードされた文字列としてマーシャリングされます。 documentationから:

アレイとスライス値は、その[]byte除いて、JSON配列としてエンコードbase64でエンコードされた文字列として符号化し、そしてゼロスライスはヌルJSONオブジェクトとして符号化します。

これらの値は、アンマーシャリングされたときに正しくデコードされます。

これが行われる理由は、JSONに生のバイトのネイティブ表現がないためです。詳細な説明については、this questionを参照してください。

+0

JSONを適切にフォーマットする唯一の方法は、エンコードする前に[]バイトを文字列にキャストすることです。あるいは、この問題に対するより良いアプローチがありますか? – MonkeyButter

+3

JSONの形式が正しくありません。この動作はバグではありません。文字列表現が必要で、テキストのみを扱う場合は、 '[] byte'の代わりに' string'を使います。 – nemo

関連する問題