2016-02-04 4 views
1

У меня есть следующий код, который извлекает данные json через API.Swift iOS NSJsonSerialization не работает молча

 let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     // print("Response: \(response)") 
     // print("DATA: \(data)") 

     if data != nil { 
      do { 


       print(NSString(data: data!, encoding: NSUTF8StringEncoding)) 

       if let jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSArray { 
        print("\n\nThe return JSON looks like this: \(jsonResults)\n\n") 
       } 
      } catch { 
       print("\n\nProblem getting JSON back from GET API.\n\n") 
      } 

     } else { 
      print("API Not Available") // data was nil 
     } 

    }) // task 

    task.resume() 

«Печать» NSString показывает, что на моих глазах выглядит как действительный JSON. Консоль показывает это как:

Optional({"id":15,"user_id":11,"breed_id":593,"gender":"Male","age_years":5,"tally":{"count":1246,"struvite":716,"calcium_oxalate":388,"urate":217,"calcium_phosphate":30,"silica":21,"compound":41},"created_at":"2016-02-04T08:26:14.719-06:00","updated_at":"2016-02-04T08:26:14.719-06:00"}) 

Однако, «если позволить jsonResults =» утверждение не выполнить успешно (там нет печатного jsonResults) и улов не выполняет либо - так это, кажется, как немая ошибку.

Очень похожий вызов работает с другой частью API. Единственное большое различие заключается в том, что «tally» в возврате JSON на этот вызов вложен.

Любые предложения приветствуются.

+1

Примерами данных, которые вы вставили в свой код, является словарь, а не массив. вам нужно ввести его в тип словаря, например. '[String: Anyobject]', как предложено [dzk] (http://stackoverflow.com/a/35204049/5836843) ниже. – ishaq

ответ

-1

Ответ был сочетание ДЗК и ответов Исхака.

я заменил

if let jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSArray 

с:

if let jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary 

Существенная часть бросала его в качестве словаря, а не массив.

2

JSON не может быть сериализовать правильно, поэтому попробуйте заменить:

if let jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSArray 

с:

if let jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! [String: AnyObject] 
1
let jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSMutableDictionary 

Эта реализация очень аккуратная, и вам не нужно указывать их типы данных.

Смежные вопросы