是否可以在运行 JSON 编码时排除已经是 JSON 的字段



我正在 restAPI 上构造一个回复并使用 json。NewEncoder.Encode(( 生成 JSON 回复(注意:w 是响应编写器(。

u := Reply{Id: id, Status: "progress", Message: ""}
json.NewEncoder(w).Encode(u)

这工作正常。

但是我遇到了另一种情况,即消息将使用已经采用 JSON 格式的字符串填充:

RetMessage := "{"debug": "on", "window": { "width": 500, "height": 500}}"
u := Reply{Id: id, Status: "progress", Message: RetMessage}
json.NewEncoder(w).Encode(u)

然后回复将是带有转义引号等的 JSON,这当然是有意义的,因为它将其解析为 JSON 的字符串,但它当然打破了这个概念,因为我希望 RetMessage 按原样传递,而其他人我希望被编码为 JSON。

有什么方法可以巧妙地解决这个问题吗?RetMessage 中的内容来自一个文件,所以我无法更改 RetMessage 有时确实已经以 JSON 编码的形式出现。

如果Message是一个完整、有效的 JSON 对象,您可以通过将其转换为类型 json.RawMessage 来完成您想要的:

type ReplyWithJSON struct {
    Id      int
    Status  string
    Message json.RawMessage
}
u := ReplyWithJSON{Id: id, Status: "progress", Message: json.RawMessage(RetMessage)}
json.NewEncoder(w).Encode(u)

这应生成以下输出:

{"Id":123,"状态":"进度","消息":{">

调试":"开","窗口":{"宽度":500,"高度":500

}}}

在操场上看到它的实际效果。

由于没有任何聪明的方法可以做到这一点(而且尝试寻求聪明的方法也可能是矫枉过正(,我只是将其更改为:

fmt.Fprintf(w, "{"Id":"%s","Status":"%s","Message":%s}", reply.Id, reply.Status, reply.Message)

最新更新