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

时间:2019-06-19 18:31:56

标签: go

我在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 个答案:

答案 0 :(得分:5)

如果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,“ Status”:“进度”,“ Message”:{“ debug”:“ on”,“ window”:{“ width”:500,“ height”:500}}}}

查看实际情况on the playground

答案 1 :(得分:-3)

由于没有任何明智的方法(也许试图寻求一种明智的方法也可能会矫kill过正),所以我将其更改为:

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