编组json.RawMessage返回base64编码的字符串

编组json.RawMessage返回base64编码的字符串,json,go,Json,Go,我运行以下代码: 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)) } 操场: 输出: "eyJmb28iO

我运行以下代码:

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))  
}
操场:

输出:

"eyJmb28iOiJiYXIifQ=="
{"foo":"bar"}
所需输出:

"eyJmb28iOiJiYXIifQ=="
{"foo":"bar"}
为什么它将我的
RawMessage
编码为普通的
[]字节

毕竟,RawMessage对MarshalJSON的实现只是返回字节片

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawMessage) MarshalJSON() ([]byte, error) {
    return *m, nil 
}
在一份报告中找到了答案

传递给
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))  
}

如何使用j变量中的键和值?@RockBalbao
j
是JSON编码的字符串。要访问这些值,您需要使用。