Получение разных структур json по одному запросу

38 views
Skip to first unread message

Inno Bragovich

unread,
Mar 25, 2018, 5:05:17 PM3/25/18
to Golang Russian
Коллеги, всем здравствия!

Вопрос: Как быть, если дин и тот же реквест к сервису может возвращать разный json?

    body, _ := ioutil.ReadAll(resp.Body)
   err = json.Unmarshal(body, &myStruct)

Вот я читаю ответ от сервера, хочу размаршаллить в структурку, но ..

Сервер может ответить либо в соответствии с моей структурой, либо дать {error: "some text..."} (т.е. структура ответа-ошибки заранее тоже известна).
Как быть?

Пока сделал решение, которое кажется шит-кодом:
    if err != nil {
       err = json.Unmarshal(body, &errorStruct)
   }

Посоветуйте, как по-человечески сделать в таких ситуациях?

Inno Bragovich

unread,
Mar 25, 2018, 5:06:13 PM3/25/18
to Golang Russian
p.s. извиняюсь за цветные приколы, скопировался стиль редактора

Daniel Podolsky

unread,
Mar 25, 2018, 6:01:10 PM3/25/18
to gola...@googlegroups.com
вариантов больше одного

1. включить error в структуру, и проверять, пустой ли он
2. анмаршалить всегда первым делом error

2018-03-26 0:06 GMT+03:00 Inno Bragovich <innobr...@gmail.com>:
> p.s. извиняюсь за цветные приколы, скопировался стиль редактора
>
> --
> Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес
> golang-ru+...@googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.

Inno Bragovich

unread,
Mar 25, 2018, 6:27:15 PM3/25/18
to Golang Russian


On Monday, March 26, 2018 at 1:01:10 AM UTC+3, Daniel Podolsky wrote:
вариантов больше одного

1. включить error в структуру, и проверять, пустой ли он
Не красиво. Если ответ корректный, то поле эррора в структуре - пустое. Если ответ с эррором - остальные поля будут пустые. Усугубляется тем, что для одних функций\запросов сервер в случае отсутствия ошибки отдаёт сообщение типа {error:"no error"}, для других нет (бардак!), и я не хотел бы перенимать этот бардак себе в код. Но так - да, если не идеализировать, то сойдёт. Собственно, вариант этот я уже сделал.
 
2. анмаршалить всегда первым делом error

А что это меняет?... 

Евгений Д

unread,
Mar 25, 2018, 10:27:36 PM3/25/18
to Golang Russian
этот бардак является общепринятой практикой )

понедельник, 26 марта 2018 г., 5:27:15 UTC+7 пользователь Inno Bragovich написал:

Виталий Осипов

unread,
Mar 25, 2018, 11:10:23 PM3/25/18
to Golang Russian
если управляешь сервером, то пусть сервер возвращает разный код, 200 - хорошо, 500 - плохо :)

иначе как сказано выше

понедельник, 26 марта 2018 г., 2:05:17 UTC+5 пользователь Inno Bragovich написал:

Alex Lurye

unread,
Mar 26, 2018, 2:47:15 AM3/26/18
to gola...@googlegroups.com
On Mon, Mar 26, 2018 at 12:27 AM Inno Bragovich <innobr...@gmail.com> wrote:


On Monday, March 26, 2018 at 1:01:10 AM UTC+3, Daniel Podolsky wrote:
вариантов больше одного

1. включить error в структуру, и проверять, пустой ли он
Не красиво.

Это ровно настолько же некрасиво, как и формат данных, который ваш сервер возвращает. По-моему, это вообще самый прямой способ, как с таким форматом работать.

Andrey Velikoredchanin

unread,
Mar 26, 2018, 2:52:38 AM3/26/18
to golang-ru
Я в этом случае использую для демаршализации переменную map[string]interface{}. Очень неплохо все декодируется в map.

26 марта 2018 г., 9:47 пользователь 'Alex Lurye' via Golang Russian <gola...@googlegroups.com> написал:

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+unsubscribe@googlegroups.com.

Inno Bragovich

unread,
Mar 26, 2018, 4:34:00 AM3/26/18
to Golang Russian

On Monday, March 26, 2018 at 6:10:23 AM UTC+3, Виталий Осипов wrote:
если управляешь сервером, то пусть сервер возвращает разный код, 200 - хорошо, 500 - плохо :)

иначе как сказано выше


Не-а, не управляю, иначе я бы стандартизировал ответы и везде бы сделал наличие статусов ответа и эрроров.
 

On Monday, March 26, 2018 at 9:52:38 AM UTC+3, Andrey Velikoredchanin wrote:
Я в этом случае использую для демаршализации переменную map[string]interface{}. Очень неплохо все декодируется в map.

Ну, я тоже так делаю = ) 

Евгений Д

unread,
Mar 26, 2018, 12:44:27 PM3/26/18
to Golang Russian
не советовал бы так делать. если запрос корректен с точки зрения протокола HTTP и json передан с уровня http далее, ответ должен быть 200, иные статусы должны обозначать ошибки транспортного уровня. Ошибки логики уже внутри json. Иначе, при наличии балансировщика перед сервисом, рискуем исключить сервис из балансировщика как сбойный.

понедельник, 26 марта 2018 г., 10:10:23 UTC+7 пользователь Виталий Осипов написал:

Alex Lurye

unread,
Mar 27, 2018, 3:06:58 AM3/27/18
to gola...@googlegroups.com
Ошибки серии 400 - на случай если клиент дурак. Ошибки серии 500 - если сервер дурак. Тогда балансировщик будет вести себя правильно.

--
Вы получили это сообщение, поскольку подписаны на группу "Golang Russian".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес golang-ru+...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages