JSON マーシャリングの領域で、バイト スライス ([]byte) を次のように変換しようとしていますJSON では、予期しない結果 (一見奇妙な文字列) が生成されることがよくあります。この背後にある理由を詳しく調べ、JSON 変換の適切な方法を調べてみましょう。
Go 標準ライブラリ (https://golang. org/pkg/encoding/json/#Marshal)、バイト スライスは JSON マーシャリング中に一意に処理されます。 JSON 配列に直接変換されるのではなく、base64 を使用してエンコードされて文字列が生成されます。これは、多くの場合、混乱を招く結果につながります。
次のコード スニペットを考えてみましょう:
package main import ( "encoding/json" "fmt" "os" ) func main() { type ColorGroup struct { ByteSlice []byte } group := ColorGroup{ ByteSlice: []byte{0, 0, 0, 1, 2, 3}, } b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) }
このコードを実行すると、次の出力が生成されます:
{"ByteSlice":"AAAAAQID"}
「奇妙な文字列」AAAAAQID は、バイト スライス [0 0 0 1 2 3].
エンコードされた文字列から元のバイト スライスを取得するには、次の Base64 パッケージを使用できます。実行:
package main import ( "encoding/base64" "encoding/json" "fmt" "os" ) func main() { type ColorGroup struct { ByteSlice []byte } group := ColorGroup{} b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } err = json.Unmarshal(b, &group) if err != nil { fmt.Println("error:", err) } decodedBytes, err := base64.StdEncoding.DecodeString(group.ByteSlice) if err != nil { fmt.Println("error:", err) } fmt.Println(decodedBytes) }
出力:
[0 0 0 1 2 3]
JSON マーシャリング中にバイト スライスがこの動作を示す理由を理解することは、データを効果的に管理するために重要です。 Base64 エンコードおよびデコード メカニズムを利用することで、バイト スライスと JSON データの間でシームレスに変換することが簡単な作業になります。
以上がGo Byte スライスが JSON にマーシャリングされると「奇妙な文字列」に変換されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。