2014-06-15 34 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"} 

爲什麼它base64編碼我的RawMessage就好像它是一個普通的[]byte

畢竟,RawMessage的實現MarshalJSON的是剛剛返回字節片

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

回答

29

發現在一個go-nuts thread

答案傳遞給json.Marshal的值必須是一個指針json.RawMessage正常工作:

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