ホームページ > バックエンド開発 > Golang > Go Byte スライスが JSON にマーシャリングされると「奇妙な文字列」に変換されるのはなぜですか?

Go Byte スライスが JSON にマーシャリングされると「奇妙な文字列」に変換されるのはなぜですか?

Barbara Streisand
リリース: 2024-12-15 11:00:13
オリジナル
1001 人が閲覧しました

Why Does My Go Byte Slice Convert to a

バイトから JSON への変換のトラブルシューティング: 「奇妙な文字列」が検出されました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート