【问题标题】:Swift iOS NSJsonSerialization fails silentlySwift iOS NSJsonSerialization 静默失败
【发布时间】:2016-05-14 05:38:43
【问题描述】:

我有以下代码通过 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 返回中的“计数”是嵌套的。

欢迎提出任何建议。

【问题讨论】:

  • 您在代码中粘贴的示例数据是字典,而不是数组。您需要将其转换为字典类型,例如[String: Anyobject] 由下面的dzk 建议。

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


【解决方案1】:

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]

【讨论】:

    【解决方案2】:

    答案是 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
    

    最重要的部分是将其转换为字典,而不是数组。

    【讨论】:

      【解决方案3】:
      let jsonResults = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSMutableDictionary
      

      这个实现更加简洁,您不必指定它们的数据类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        • 2018-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多