JSON []byte を文字列としてマーシャリング
質問:
Go でエンコードするとき[]byte フィールドを JSON として含む構造体の場合、結果の JSON にはスライスの内容の予期しない文字列表現が含まれます。たとえば、コード:
type Msg struct { Content []byte } func main() { helloStr := "Hello" helloSlc := []byte(helloStr) json, _ := json.Marshal(Msg{helloSlc}) fmt.Println(string(json)) }
JSON 文字列を生成します:
{"Content":"SGVsbG8="}
スライスの内容に対して json.Marshal によってどのような変換が実行されるか、元の文字列の内容はどのように変換されるか保存されていますか?
答え:
Base64 エンコーディング
デフォルトでは、Go の json.Marshal 関数は []byte 配列を次のようにエンコードします。 JSON 内の生のバイトを表す、base64 でエンコードされた文字列。 JSON 仕様によれば、JSON には生のバイトのネイティブ表現がありません。
カスタム マーシャリング:
元の文字列コンテンツを保持するために、カスタム マーシャリングはMsg 構造体のカスタム MarshalJSON メソッドを定義することで実装されます。
import ( "encoding/json" "fmt" ) type Msg struct { Content []byte } func (m Msg) MarshalJSON() ([]byte, error) { return []byte(fmt.Sprintf(`{"Content": "%s"}`, m.Content)), nil } func main() { helloStr := "Hello" helloSlc := []byte(helloStr) json, _ := json.Marshal(Msg{helloSlc}) fmt.Println(string(json)) }
このカスタム実装は、Content フィールドを JSON オブジェクト内の文字列としてエンコードし、元のコンテンツを保持します。
以上がGo 構造体の `[]byte` フィールドを JSON としてマーシャリングするときに元の文字列コンテンツを保持する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。