2016-09-27 10 views
0

Предыдущая версия этого запроса Alamofire .POST и синтаксический анализ SwiftyJSON отлично работает с Swift 2.2 и Xcode 7. Обновлено до Swift 3.0, что требовалось установить обновленный Alamofire (4.0.0) и обновить SwiftyJSON. После некоторых настроек синтаксиса все компилируется.Alamofire 4 Запрос возвращает NSArray, не может понять, как разбираться с SwiftyJSON в Swift 3

Проблема заключается в том, что теперь мое веб-приложение возвращает NSArray, тогда как раньше, когда код работал, почти идентичный запрос получил возврат NSData, который SwiftyJSON будет анализировать. В следующем коде показан запрос:

Alamofire.request("https://www.mywebappurl", method: .post, parameters: parameters) 
    .responseJSON { (response:DataResponse<Any>) in 

        if let data = response.result.value as? Data { 

Переменная данных никогда не назначается, поскольку тип ответа не является NSData. Пытался бросить к этому типу, изменив последнюю строку на это:

let data = response.result.value as! Data 

Эта версия компилируется нормально, но как только вы вызываете запроса вы получите сообщение об ошибке: Не удалось бросить значение типа «__NSArrayI» (0x105a37c08) в «NSData»

Обратите внимание, что запрос возвращает данные, как ожидалось. И в предыдущем Alamofire эти данные были NSData без каких-либо действий по их преобразованию. Поскольку из вышеупомянутой ошибки видно, что возвращенные данные уже являются массивом, уже анализировали ли они Alamofire? Или есть что-то, что можно сделать, чтобы SwiftyJSON разобрал его так, как будто он разбирался раньше?

EDIT

Поскольку текущий тип возвращаются является NSArray, и веб-приложение посылает массив, не представляется возможным, что SwiftyJSON разбор больше не нужен? Попробовал следующий код:

Alamofire.request("https://www.mywebappurl", method: .post, parameters: parameters) 
.responseJSON { (response:DataResponse<Any>) in 

let testdata = response.result.value as! NSArray 
print(testdata[0]) 

которая дала этот вывод в Xcode «All Output» экран:

{ 
    1 = "08/01/16"; 
    2 = 285; 
    3 = 160; 
} 

Это мне не ясно, если это означает, что TestData представляет собой массив массивов, массив словари или массив непарных строк. Таким образом, в качестве альтернативы ответом на вопрос «Как получить ответ NSData из этого запроса Alamofire» ответ на вопрос «Какая одна строка кода, если таковая имеется, может использоваться для получения целочисленного значения 285 из NSArray testdata, показанный выше? " также разрешит проблему.

+0

Получите ли вы веб-службу массив JSON? –

+0

Да, он возвращает JSON-кодированный массив. –

ответ

1

При изменении инициализации данных строки из этого:

if let data = response.result.value as? Data { 

к этому:

let data = response.data 

Затем результаты запроса в качестве возврата NSData, которые могут быть разобраны по SwiftyJSON, как это было раньше. Рабочий запрос и анализ кода выглядит следующим образом:

Alamofire.request("https://www.mywebappurl", method: .post, parameters: parameters) 
.responseJSON { (response:DataResponse<Any>) in 

let data = response.data 
let jsonvalues = JSON(data: data!) 

Некоторые обработки ошибок может быть уместно добавить, но это не имеет отношения к рассматриваемому вопросу.