>백엔드 개발 >Golang >`json.Marshal`을 사용할 때 json.RawMessage가 base64로 인코딩되는 이유는 무엇입니까?

`json.Marshal`을 사용할 때 json.RawMessage가 base64로 인코딩되는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-09 06:56:02563검색

Why is my json.RawMessage being base64 encoded when using `json.Marshal`?

json.Marshal 및 json.RawMessage의 Base64 인코딩 문제

제공된 코드에서 json.Marshal은 json.RawMessage에 적용됩니다. , 임의의 JSON 데이터를 나타내기 위한 것입니다. 그러나 출력이 예기치 않게 base64로 인코딩되었습니다.

문제

조사 결과 json.RawMessage의 MarshalJSON 메서드가 다음과 같이 단순히 메시지의 바이트 조각을 반환한다는 것이 분명해졌습니다. 여기에서 볼 수 있습니다:

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil 
}

따라서 RawMessage에 대한 포인터 없이 json.Marshal을 호출하면 이를 일반 []바이트로 잘못 처리하여 base64 인코딩이 발생합니다.

해결책

go-nuts 스레드에서 제안한 대로 해결 방법은 아래와 같이 json.Marshal을 호출할 때 json.RawMessage에 대한 포인터를 제공하는 것입니다.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(&raw) // Pass pointer to RawMessage
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  
}

이 접근 방식은 포인터가 아닌 것이 원시 바이트 값을 나타내는 것으로 가정하는 json.Marshal에서 예상되는 동작과 일치합니다. RawMessage에 대한 포인터를 제공함으로써 메시지를 JSON 값으로 올바르게 인식하고 그에 따라 렌더링합니다.

위 내용은 `json.Marshal`을 사용할 때 json.RawMessage가 base64로 인코딩되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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