>백엔드 개발 >Golang >내 `json.RawMessage`가 Base64로 마샬링되는 이유는 무엇입니까?

내 `json.RawMessage`가 Base64로 마샬링되는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-09 21:35:02520검색

Why Does My `json.RawMessage` Marshal as Base64?

json.RawMessage 마샬링: Base64 인코딩의 이유 공개

이 흥미로운 시나리오에서는 다음을 시도하는 동안 비정상적인 동작이 발생했습니다. json.RawMessage 인스턴스를 마샬링합니다. 놀랍게도 예상했던 인코딩되지 않은 JSON 문자열을 얻는 대신 꼼꼼하게 base64로 인코딩된 버전을 발견했습니다. 이 수수께끼를 해결하기 위해 기본 메커니즘을 깊이 파헤쳐 보겠습니다.

json.RawMessage에서 Marshal 함수를 사용할 때 중요한 요소는 입력 값이 올바른지 확인하는 것입니다. 사실 포인터입니다. 이 겉보기에 미묘한 차이는 json.RawMessage의 동작에서 중추적인 역할을 합니다.

당신이 올바르게 지적한 것처럼 json.RawMessage의 MarshalJSON 구현은 단순히 기본 바이트 슬라이스를 반환하도록 설계되었습니다. 그러나 입력 값이 포인터가 아닌 경우 Marshal 함수는 출력하기 전에 자동으로 바이트 슬라이스에 base64 인코딩을 적용합니다.

이 상황을 바로잡고 원하는 결과를 얻으려면 해결 방법은 다음과 같이 간단합니다. json.RawMessage에 대한 포인터입니다. 이렇게 하면 기본 바이트 슬라이스에서 직접 작동하도록 Marshal 함수에 효과적으로 지시하여 바람직하지 않은 base64 인코딩 프로세스를 우회할 수 있습니다.

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

package main

import (
    "encoding/json"
    "fmt"
)

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

By 이 미묘하지만 필수적인 변화를 구현함으로써 이제 기대되는 결과를 자신있게 예상할 수 있습니다. 결과:

{"foo":"bar"}

이 수정된 코드는 포인터 기반 입력 값에 대한 Marshal 함수의 요구 사항에 맞춰 원하지 않는 base64 인코딩을 효과적으로 제거합니다. 이 새로운 지식으로 무장하면 이제 비슷한 문제를 자신있게 처리하고 Go 애플리케이션에서 원하는 JSON 마샬링 동작을 보장할 수 있습니다.

위 내용은 내 `json.RawMessage`가 Base64로 마샬링되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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