как проверить КЛЮЧ на наличие в json.RawMessage на GO?

#go

#Вперед

Вопрос:

У меня есть:

 type User struct {
    UID                     int          `json:"id"`
    FirstName               string       `json:"first_name"`
    LastName                string       `json:"last_name"`
    Sex                     int          `json:"sex"`
    Nickname                string       `json:"nickname"`
    ScreenName              string       `json:"screen_name"`
    BDate                   string       `json:"bdate"`

}
  

код:

 var userList []*User
json.Unmarshal(resp.Response, amp;userList)
  

ответ сервера может быть:

 [{"id":1,"first_name":"name","last_name":"last","sex":2,"nickname":"","screen_name":"screen","bdate":"1.1.1"}]
  

или

 [{"id":1,"first_name":"name","sex":2,"nickname":"","screen_name":"screen"}]
  

моя проблема при вызове несуществующего КЛЮЧА ошибка во время выполнения « userList[0].LastName «:

 error: index out of range
  

в первом случае сервер вернул:

 "last_name":"last" and "bdate":"1.1.1"
  

во втором нет

Когда пользователя нет, сервер возвращается.

 [{"error_code": 0, "error_msg": "Invalid user id"}]
  

ответ:

     if len(userList) > 0 {
            c.String(http.StatusOK, "People name: %s", userList[0].FirstName)
        } else {
            c.String(http.StatusOK, "No People: %s", login)
        }
  

Спасибо Magestro

Комментарии:

1. вы уверены, что хотите, чтобы указатель был там? ИМО, вы должны написать var userList []User

2. Информация, представленная в вопросе, противоречива. Все примеры документов JSON разархивированы до фрагмента с длиной> 0 (см. play.golang.org/p/N34S0opAQPp ), но пользователь указан только в первых двух.

3. Проверка ошибок в скрипте перед обработчиком len (UserList) if. Ошибка != nil { возвращает nil, обработчик. Ошибка }

Ответ №1:

error: index out of range означает, что userList не имеет значения с индексом [0] , а не с пустым LastName

В вашем примере все работает нормально: https://play.golang.org/p/WHIqgB52w_I

Вы уверены, что сервер возвращает допустимую строку и что эта строка существует в resp.Response ?

Попробуйте распечатать resp.Response и найдите ошибку в другом месте

Комментарии:

1. В этом случае сервер возвращает object , а не an array . Таким образом, этот ответ не может быть преобразован в тип среза. У вас есть как минимум 2 решения: 1) Создайте пользовательскую « введите UsersResponse struct { Error struct { Cose int Msg string RequestParams map[string]string } Users []*User } ` И создайте пользовательские функции unmarshall для этого типа 2) Проверьте ошибку следующим образом: play.golang.org/p/a7sUT5T_EOn