> 백엔드 개발 > Golang > Go의 `json.Marshal`이 []byte를 base64 문자열로 변환하는 이유는 무엇이며 어떻게 해결할 수 있나요?

Go의 `json.Marshal`이 []byte를 base64 문자열로 변환하는 이유는 무엇이며 어떻게 해결할 수 있나요?

Linda Hamilton
풀어 주다: 2024-12-22 00:04:17
원래의
738명이 탐색했습니다.

Why does Go's `json.Marshal` convert []byte to a base64 string, and how can I fix it?

[]byte를 JSON으로 마샬링: 신비한 문자열 디코딩

바이트 슬라이스([]byte)를 JSON 형식으로 변환하려고 할 때 개발자는 종종 예상치 못한 문자열 표현을 접하게 됩니다. . 이 문서에서는 이러한 동작의 이유를 자세히 알아보고 바이트 슬라이스를 정확하게 마샬링하기 위한 솔루션을 제공합니다.

수수께끼의 사례

다음 코드 조각을 고려하세요.

import (
    "encoding/json"
    "fmt"
    "os"
)

func main() {
    type ColorGroup struct {
        ByteSlice    []byte
        SingleByte   byte
        IntSlice     []int
    }
    group := ColorGroup{
        ByteSlice:  []byte{0, 0, 0, 1, 2, 3},
        SingleByte: 10,
        IntSlice:   []int{0, 0, 0, 1, 2, 3},
    }
    b, err := json.Marshal(group)
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stdout.Write(b)
}
로그인 후 복사

실행되면 다음 코드가 출력됩니다.

{"ByteSlice":"AAAAAQID","SingleByte":10,"IntSlice":[0,0,0,1,2,3]}
로그인 후 복사

흥미롭네요. 바이트 배열을 포함해야 하는 ByteSlice 필드는 "AAAAAQID"로 렌더링되었습니다.

Unraveling the Mystery

설명은 json 패키지 설명서에 있습니다.

배열 및 슬라이스 값은 JSON 배열로 인코딩됩니다. 단, []byte는 base64로 인코딩된 문자열로 인코딩되고 nil은 인코딩됩니다. 슬라이스는 null JSON 객체로 인코딩됩니다.

이 경우 바이트 배열인 ByteSlice 필드는 JSON 배열이 아닌 base64 인코딩 문자열로 인코딩됩니다.

A 해결 방법: Base64 디코딩

[]바이트 데이터를 예상대로 JSON으로 마샬링하려면 base64 표현을 디코딩해야 합니다. 업데이트된 코드 버전은 다음과 같습니다.

package main

import (
    "encoding/base64"
    "encoding/json"
    "fmt"
    "os"
)

func main() {
    type ColorGroup struct {
        ByteSlice    []byte
        SingleByte   byte
        IntSlice     []int
    }
    group := ColorGroup{
        ByteSlice:  []byte{0, 0, 0, 1, 2, 3},
        SingleByte: 10,
        IntSlice:   []int{0, 0, 0, 1, 2, 3},
    }
    // Decode ByteSlice from base64 before marshaling
    decodedByteSlice, err := base64.StdEncoding.DecodeString(string(group.ByteSlice))
    if err != nil {
        fmt.Println("error:", err)
    }
    group.ByteSlice = decodedByteSlice
    b, err := json.Marshal(group)
    if err != nil {
        fmt.Println("error:", err)
    }
    os.Stdout.Write(b)
}
로그인 후 복사

이제 결과 JSON 출력은 ByteSlice 필드를 바이트 배열로 올바르게 나타냅니다.

{"ByteSlice":[0,0,0,1,2,3],"SingleByte":10,"IntSlice":[0,0,0,1,2,3]}
로그인 후 복사

위 내용은 Go의 `json.Marshal`이 []byte를 base64 문자열로 변환하는 이유는 무엇이며 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿