为了账号安全,请及时绑定邮箱和手机立即绑定

运行 JSON Encode 时是否可以排除已经是 JSON 的字段?

运行 JSON Encode 时是否可以排除已经是 JSON 的字段?

Go
拉莫斯之舞 2023-06-26 16:49:14
我正在restAPI上构建回复并使用json.NewEncoder.Encode()生成JSON回复(注意:w是responsewriter)。u := Reply{Id: id, Status: "progress", Message: ""} json.NewEncoder(w).Encode(u)这很好用。但是我遇到了另一种情况,其中 Message 将使用已经采用 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 编码的形式出现。
查看完整描述

2 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

如果Message是一个完整、有效的 JSON 对象,您可以通过将其转换为 type 来完成您想要的操作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,"Status":"progress","Message":{"debug":"on","window":{"width":500,"height":500}}}

在操场上观看它的表演。


查看完整回答
反对 回复 2023-06-26
?
皈依舞

TA贡献1851条经验 获得超3个赞

由于没有任何明智的方法可以做到这一点(并且尝试寻求明智的方法可能也太过分了)我只是将其更改为:

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



查看完整回答
反对 回复 2023-06-26
  • 2 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信