JSON Неупорядочить ожидаемый ответ и сообщение об ошибке - PullRequest
0 голосов
/ 07 мая 2020

Я делаю запрос JSON к стороннему API. Если срок действия моего токена авторизации истек, я получаю {"error": "message"}. Если все прошло успешно, я получаю правильный ответ.

Прямо сейчас я дважды вызываю json.Unmarshal, чтобы проанализировать ответ: один раз, чтобы проверить наличие ошибки, и один раз, чтобы проанализировать реальные данные.

Есть ли способ избежать двойного звонка Unmarshal?

type Unknown map[string]interface{}
type Response struct {
    Status   string `json:"status"`
    Strategy string `json:"strategy"`
    Items    []Item `json:"items"`
}
unknown := Unknown{}
json.Unmarshal(jsonData, &unknown)

if val, ok := unknown["error"]; ok {
    fmt.Println(val)
    return
}

response := Response{}
err := json.Unmarshal(jsonData, &response)
if err != nil {
    fmt.Println("There was an error")
    fmt.Println(err)
    return
}

1 Ответ

3 голосов
/ 07 мая 2020

Вы можете использовать встраивание для одновременного декодирования всего:

type Response struct {
    Status   string `json:"status"`
    Strategy string `json:"strategy"`
    Items    []Item `json:"items"`
}

var dest struct {
    Error string `json:"error"`
    Response // embedded Response
}
if err := json.Unmarshal(jsonData, &dest); err != nil {
    fmt.Println(err)
    return
} else if len(dest.Error) > 0 {
    fmt.Println(dest.Error)
    return
}

response := dest.Response
// ...

См. Пример на игровой площадке: https://play.golang.com/p/eAhFt99n07k

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...