【问题标题】:Marshaling JSON []byte as strings in Go在 Go 中将 JSON []byte 编组为字符串
【发布时间】:2016-07-27 16:17:19
【问题描述】:

我有一个包含字符串的结构,我想将其编码为 JSON 的 []byte 字段。但是,生成的 JSON 包含切片内容的非预期字符串表示。这是我所指的一个例子:

package main

import (
    "fmt"
    "encoding/json"
    )

type Msg struct {
    Content []byte
}

func main() {
    helloStr := "Hello"
    helloSlc := []byte(helloStr)
    fmt.Println(helloStr, helloSlc)

    obj := Msg{helloSlc}
    json, _ := json.Marshal(obj)
    fmt.Println(string(json))
}

这会产生以下输出:

Hello [72 101 108 108 111]
{"Content":"SGVsbG8="}

json.Marshal() 方法对 []byte 编码的字符串执行什么样的转换。如何使用我的字符串 {"Content":"Hello"} 的原始内容生成 JSON?

【问题讨论】:

    标签: json go


    【解决方案1】:

    []byte 被编组为 base64 编码字符串。来自documentation

    数组和切片值编码为 JSON 数组,但 []byte 编码为 base64 编码字符串,nil 切片编码为空 JSON 对象。

    这些值在解组时被正确解码。

    这样做的原因是 JSON 没有原始字节的本机表示。详细解释见this question

    【讨论】:

    • 所以,我想正确格式化我的 JSON 的唯一方法是在编码之前将 []byte 转换为字符串。还是有更好的方法来解决这个问题?
    • 您的 JSON 格式正确。此行为不是错误并且是有意的。如果您想要一个字符串表示并且只处理文本,请使用string 而不是[]byte
    【解决方案2】:

    我遇到了同样的问题,即使这是一个相当老的问题并且已经回答了,还有另一种选择。

    如果您使用 json.RawMessage(内部是 []byte)而不是 []byte 作为类型,则编组按预期工作到 Json 字符串中。

    【讨论】:

    • 请注意,生成的字节切片将与 JSON 值不同,因为它将用双引号括起来,即切片的每一端都包含 2 个额外的 " 符号
    猜你喜欢
    • 2016-12-22
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多