Тип сообщения proto3 для json данных маршала - PullRequest
0 голосов
/ 07 марта 2020

Я реализую API gRP C и хотел добавить JSON данные тела в том виде, в каком они есть в ответе.

, поэтому я попытался:

type Message struct {
    Subject string `json:"subject"`
    Body    interface{}  `json:"body"`
}

proto3

message Message {
    string subject = 1;
    string body = 2;
}

Код API:

    en, err := client.Request.Get(req.Name)
    if err != nil {
        return nil, status.Error(codes.InvalidArgument, err.Error())
    }

    data, _ := json.Marshal(en.Body)

    return &response.Message{
        Subject: en.Subject,
        Body:    string(data),
    }, nil

После добавления этого получения gRP C Ответ API:

{
  "subject": "dev",
  "body": "{\"name\":\"environment\",\"description\":\"The default environment\"}",
}

Проблема в теле JSON Значение ключа Dynami c. Есть ли способ, которым мы можем получить ответ что-то вроде

{
  "subject": "dev",
  "body": {"name":"environment","description":"The default environment"},
}

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Я не думаю, что возможно внедрить действительно полезный объект в полезную нагрузку, подобную этой, с помощью буферов протокола, если вы хотите преобразование по умолчанию в прото-JSON.

Вы можете добавить свой собственный logi c, чтобы выполнить преобразование в JSON и заставить его делать то, что вы ожидаете.

В зависимости от вашей более широкой цели, Любые s также могут быть полезны.


Обратите внимание, что теги json здесь:

type Message struct {
    Subject string `json:"subject"`
    Body    interface{}  `json:"body"`
}

не имеют значения. gRP C генерирует JSON на основе протоколаного буфера type Message; Приведенные здесь теги влияют только на то, как библиотека Go json отобразит тип Go Message.

.
1 голос
/ 12 марта 2020

попробуйте это: go на go игровую площадку (https://play.golang.org/) и затем вставьте это в: ответ, а затем с помощью strconv unquote, чтобы получить строку, которую мы хотим

...