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