Можно ли исключить поле, которое уже является JSON, при запуске JSON Encode? - PullRequest
1 голос
/ 19 июня 2019

Я создаю ответ на restAPI и использую json.NewEncoder.Encode () для генерации ответа JSON (примечание: w - это responsewriter).

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.

Ответы [ 2 ]

5 голосов
/ 19 июня 2019

Если 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": "progress", "Message": {"debug": "on", "window": {"width": 500, "height": 500}}}

Смотрите в действии на детской площадке .

0 голосов
/ 19 июня 2019

Поскольку не существует никакого разумного способа сделать это (и, возможно, также излишне пытаться искать разумный способ), я просто изменил его на:

fmt.Fprintf(w, "{\"Id\":\"%s\",\"Status\":\"%s\",\"Message\":%s}", reply.Id, reply.Status, reply.Message)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...