Разбор ответа alamofire в JSON возвращает ноль

#ios #swift #alamofire

#iOS #swift #alamofire

Вопрос:

Я пытаюсь проанализировать данные из ответа alamofire. Если я напечатаю весь ответ, он будет работать хорошо, но если я хочу напечатать определенный параметр в формате JSON, например «FirstName», он возвращает ноль.

     AF.request("http://localhost:5000/api/users").responseJSON(completionHandler: { (res) in
        
        switch res.result {
        case let .success(value):

            let xjson : JSON = JSON(res.value)
            print(xjson["firstName"].string)

        case let .failure(error):
            print(error)
        }
    })
  

В консоли нет ошибок

Код ниже

     AF.request("http://localhost:5000/api/users").responseJSON(completionHandler: { (res) in
        
        switch res.result {
        case let .success(value):

            let xjson : JSON = JSON(res.value)
            print(xjson)
            print(xjson["firstName"].string)
        case let .failure(error):
            print(error)
        }
        
    })
  

ВОЗВРАТ

 [
  {
    "dateOfBirth" : "1998-11-18T00:00:00.000Z",
    "_id" : "5f6a29ed16444afd36e9fe15",
    "email" : "sdasd@mail.com",
    "__v" : 0,
    "firstName" : "adam",
    "lastName" : "kowalski",
    "accountCreateDate" : "2020-09-22T16:44:29.692Z",
    "userPassword" : "12345",
    "userLogin" : "loginakowalski"
  }
]
nil
  

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

1. можете ли вы также опубликовать полную строку json, которая печатается при печати всего ответа?

2. попробуйте использовать только значение в JSON в качестве параметра вместо res.value

3. Добавлен ответ с консоли

4. Ваш JSON — это массив верхнего уровня, а не словарь. Вот почему это не удается.

5. у вас есть массив [] объектов в json, а не непосредственно объект json {} .. итак, что вам нужно firstName , это из first объекта в массиве json.

Ответ №1:

Это xjson один Array из JSON (выглядит пользователем) объектов. Итак, вам нужно получить доступ к элементам массива, как показано ниже,

 let xjson : JSON = JSON(res.value)
if let firstUser = xjson.array?.first {
    print(firstUser["firstName"] as? String)
}
  

Вы также можете поместить свой JSON ответ здесь и получить необходимые типы данных и код декодирования бесплатно.

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

1. Ваш код возвращает ошибку: значение типа ‘(String, JSON)’ не имеет индексов

2. Просто замените xjson.first на xjson.array?.first .

3. Я заменил, и теперь ошибки нет, но он все равно возвращает ноль…

4. У меня также есть предупреждение «Приведение из ‘JSON’ в несвязанный тип ‘String’ всегда завершается ошибкой»

5. @Kamran также замените firstUser["firstName"] as? String на firstUser["firstName"].stringValue

Ответ №2:

Спасибо всем за вашу помощь. Ниже приведен код, который возвращает правильное значение:

     AF.request("http://localhost:5000/api/users").responseJSON(completionHandler: { (res) in
        
        switch res.result {
        case let .success(value):

            let xjson : JSON = JSON(res.value)
            if let firstUser = xjson.array?.first {
                print(firstUser["firstName"].string!)
            }
        
        case let .failure(error):
            print(error)
        }
    })