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 중국어 웹사이트의 기타 관련 기사를 참조하세요!