Go 構造体の `[]byte` フィールドを JSON としてマーシャリングするときに元の文字列コンテンツを保持する方法

Mary-Kate Olsen
リリース: 2024-11-06 11:04:02
オリジナル
202 人が閲覧しました

How to Preserve Original String Content When Marshaling a `[]byte` Field in a Go Struct as JSON?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!