Swift iOS NSJsonSerialization无声地失败

时间:2016-02-04 14:38:56

标签: ios ruby-on-rails json swift api

我有以下代码通过API获取json数据。

        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"})

但是,“if let jsonResults =”语句确实成功执行(没有打印jsonResults)并且catch也没有执行 - 所以它看起来像是一个无声错误。

非常类似的调用适用于API的另一部分。唯一的区别在于此调用的JSON返回中的“tally”是嵌套的。

任何建议都表示赞赏。

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

这种实现更加简洁,您不必指定其数据类型。

答案 2 :(得分:-1)

答案是dzk和ishaq的回复组合。

我替换了

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

使用:

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

必不可少的部分是将它作为字典而不是数组。