【问题标题】:Marshalling json.RawMessage returns base64 encoded string编组 json.RawMessage 返回 base64 编码的字符串
【发布时间】:2014-06-16 07:00:14
【问题描述】:

我运行以下代码:

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 进行base64 编码,就好像它是一个普通的[]byte

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

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

【问题讨论】:

    标签: json go


    【解决方案1】:

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

    【讨论】:

    • 如何使用 j 变量中的键和值?
    • @RockBalbao j 是 JSON 编码的字符串。要访问这些值,您需要使用json.Unmarshal
    猜你喜欢
    • 2023-03-21
    • 2021-09-30
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 2018-12-28
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多