> 백엔드 개발 > Golang > json.RawMessage가 포함된 json.Marshal이 Base64로 인코딩된 문자열을 반환하는 이유는 무엇입니까?

json.RawMessage가 포함된 json.Marshal이 Base64로 인코딩된 문자열을 반환하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-12 08:04:02
원래의
558명이 탐색했습니다.

Why does json.Marshal with json.RawMessage return a Base64 encoded string?

json.RawMessage를 마샬링하면 Base64로 인코딩된 문자열이 반환됩니다.

json.RawMessage 값을 사용하여 json.Marshal을 호출하면 예상치 못한 결과가 발생합니다. 원하는 JSON 문자열 대신 base64로 인코딩된 문자열이 반환됩니다.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(raw)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  // Output: "eyJmb28iOiJiYXIifQ=="
}
로그인 후 복사

문제는 json.Marshal의 json.RawMessage 사용에 있습니다. 원시 JSON 데이터를 디코딩하지 않고 저장하도록 설계된 json.RawMessage 유형에는 단순히 바이트 슬라이스를 반환하는 MarshalJSON 메서드가 있습니다.

func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil
}
로그인 후 복사

그러나 json.Marshal이 json.RawMessage와 함께 올바르게 작동하려면, 전달된 값은 json.RawMessage 인스턴스에 대한 포인터여야 합니다.

j, err := json.Marshal(&raw)
로그인 후 복사

json.RawMessage에 대한 포인터를 전달하면 MarshalJSON 메서드가 포인터에서 호출되어 base64 없이 바이트 조각이 반환되도록 합니다. 인코딩합니다.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := json.RawMessage(`{"foo":"bar"}`)
    j, err := json.Marshal(&raw)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(j))  // Output: "{"foo":"bar"}"
}
로그인 후 복사

위 내용은 json.RawMessage가 포함된 json.Marshal이 Base64로 인코딩된 문자열을 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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