json - 如何将 jsonb 编码为 golang 中 http 响应的一部分

标签 json postgresql go

我很难通过网络传输 json。

Postgres 数据库中有一个 jsonb 字段,我需要将其添加到结构中,然后再将其作为 http 响应通过网络发送。

如果结构的有效负载字段是字符串,编码转义json,如"{\"id\":\"3aa5fff0-ad91-41b1-84f0-d97f38e0e0f4\",\“用户\”:1

如果结构的有效负载字段是 json.RawMessage,编码将 json 转义为(我想象的)一系列 base64 编码字节。

这是我正在编码并写入 http 响应流的结构:

类型 NestJobReturn 结构 { 状态字符串 `json:"status"` 嵌套 json.RawMessage `json:"nest"` }

我构建了该结构的 ret 实例并将其打印出来。如果我使用 %v 它显示字节,而 %s 将它显示为正确的、未转义的 json 字符串:

日志(“ret.Nest 的值:%v”,ret.Nest)//ret.Nest 的值:[123 34 105 ... log("Value of ret.Nest as a string: %s", ret.Nest)//Value of ret.Nest as a string: {"id": "f053...

编码和 I/O 是这样完成的:

js, _ := json.Marshal(ret) res.Header().Set("内容类型", "application/json") res.Write(js)

客户端当前收到的整个消息看起来有点像这样:

{"status":"ok","nest":"eyJpZCI6ICJmMD..."}

...但是“nest”的预期值是数据库中我的 jsonb 列中的有效 json。

有什么想法吗?

最佳答案

您需要将嵌套字段定义为指向json.RawMessage指针,例如

type NestJobReturn struct {
    Status string           `json:"status"`
    Nest   *json.RawMessage `json:"nest"`
}

jsonStr := `{"type": "Object", "desc": "Simple nested object"}`
raw := json.RawMessage(jsonStr)

ret := NestJobReturn {
    Status: "DONE",
    Nest:   &raw,
}

一个工作示例 https://play.golang.org/p/Ju7kgbawss

关于json - 如何将 jsonb 编码为 golang 中 http 响应的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39650479/

相关文章:

PHP:utf8_encode 不起作用,空的 json_encode?

ruby-on-rails - 验证范围内嵌套关联的唯一性

go - 如何决定并发操作的数量?

string - 在 go 中使用从 []byte 到 string 的不安全转换可能产生的后果是什么?

javascript - 在 JavaScript 中处理大型(12K+ 行)数组

json - HTTP 中的 "406-Not Acceptable Response"是什么?

c# - 在 JSON 数组中查找重复对象

postgresql - 如何创建一个具有与另一个表相关的日期序列的虚拟表?

sql - 对 PostgreSQL 中类型数组列中的每个元素应用除法

go - 在磁盘上找不到确实存在的文件或目录