>  기사  >  백엔드 개발  >  JSON을 인코딩하고 디코딩할 때 Go에서 []byte 필드를 어떻게 처리하나요?

JSON을 인코딩하고 디코딩할 때 Go에서 []byte 필드를 어떻게 처리하나요?

DDD
DDD원래의
2024-11-06 15:07:02344검색

How do you handle []byte fields in Go when encoding and decoding JSON?

Go에서 []바이트 필드를 사용하여 JSON 인코딩 및 디코딩

Go에서 JSON 데이터 작업에는 데이터 구조를 인코딩하고 디코딩하는 작업이 포함되는 경우가 많습니다. 그리고 JSON 형식에서. []바이트 필드로 표현된 문자열을 JSON으로 직렬화하려고 할 때 한 가지 일반적인 시나리오가 발생합니다.

json.Marshal()에 의한 Base64 변환

기본적으로 json은 .Marshal() 메서드는 []바이트 필드를 특별히 처리합니다. 원시 바이트로 직렬화하는 대신 base64로 인코딩된 문자열로 인코딩합니다. JSON에는 바이너리 데이터에 대한 기본 표현이 없기 때문에 이 변환이 필요합니다.

예상 출력과의 편차

이 동작을 설명하려면 다음 코드 조각을 고려하세요.

<code class="go">package main

import (
    "fmt"
    "encoding/json"
)

type Msg struct {
    Content []byte
}

func main() {
    helloStr := "Hello"
    helloSlc := []byte(helloStr)
    fmt.Println(helloStr, helloSlc)

    obj := Msg{helloSlc}
    json, _ := json.Marshal(obj)
    fmt.Println(string(json))
}</code>

출력:

Hello [72 101 108 108 111]
{"Content":"SGVsbG8="}

보시다시피 JSON 문자열에는 원래 문자열 자체 대신 "Hello" 문자열의 base64 인코딩 버전이 포함되어 있습니다.

변환 이해

이 동작의 이유는 원시 바이트에 대한 기본 표현이 부족한 JSON 사양에 뿌리를 두고 있습니다. []바이트 필드를 base64로 인코딩함으로써 json.Marshal()은 원본 데이터의 무결성을 유지하면서 JSON 형식과의 호환성을 보장합니다.

사용자 정의 인코딩 처리

base64로 인코딩하는 대신 원시 바이트를 보존하려는 경우 사용자 지정 직렬화 및 역직렬화 논리를 구현할 수 있습니다. 여기에는 일반적으로 구조체의 MarshalJSON() 및 UnmarshalJSON() 메서드를 재정의하는 작업이 포함됩니다.

사용자 정의 마샬링 예:

<code class="go">func (m *Msg) MarshalJSON() ([]byte, error) {
    type Alias Msg
    return json.Marshal((*Alias)(m))
}</code>
<code class="go">func (m *Msg) UnmarshalJSON(b []byte) error {
    type Alias Msg
    var a Alias
    if err := json.Unmarshal(b, &a); err != nil {
        return err
    }
    *m = Msg(a)
    return nil
}</code>

위 내용은 JSON을 인코딩하고 디코딩할 때 Go에서 []byte 필드를 어떻게 처리하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.