2014-06-15 2 views
12

나는 다음과 같은 코드를 실행합니다마샬링 json.RawMessage 반환 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)) 
} 

놀이터 :http://play.golang.org/p/qbkEIZRTPQ

출력 :

"eyJmb28iOiJiYXIifQ==" 

원하는 출력 :

{"foo":"bar"} 

RawMessage이 일반 []byte 인 것처럼 base64가 인코딩되는 이유는 무엇입니까? 결국

는 MarshalJSON의 RawMessage의 구현은 json.RawMessage가 제대로 작동하려면 json.Marshal에 전달 된 값은 포인터이어야 발견 go-nuts thread

에서 답을 바이트 슬라이스

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

답변

29

을 반환 :

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)) 
} 
+0

어떻게 j 변수에서 키와 값을 사용할 수 있습니까? –

+0

@RockBalbao'j'는 JSON으로 인코딩 된 문자열입니다. 값에 액세스하려면 [json.Unmarshal] (https://golang.org/pkg/encoding/json/#Unmarshal)을 사용해야합니다. – ANisus

관련 문제