json - 将回调 Swift JSON AnyObject 转换为 NSDictionary

标签 json swift nsdictionary anyobject

我有网络连接,使用 JSON 读取数据并提供回调;

executeRequestURL(requestURL: url, taskCallback: {(status, resp) -> Void in

            if (status == true) {
                if let results = resp as? NSDictionary {
                    print ("\(results.count) results found")
                    let list = results.allValues.first as! NSArray

                    print (list)
                }

            } else {
                print ("Error -- \(resp)")
            }
        })

这个调用;

private class func executeRequestURL(requestURL: NSURL, taskCallback: @escaping (Bool, AnyObject?) -> ()) {
        print ("Attempting URL -- \(requestURL)")

        let request: NSURLRequest = NSURLRequest(url: requestURL as URL, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: kAPI_TIMEOUT)

        let session: URLSession = URLSession.shared


        let task = session.dataTask(with: request as URLRequest, completionHandler: {
            (data, response, error) in

            guard error == nil else {
                print(error)
                return
            }
            guard let data = data else {
                print("Data is empty")
                return
            }

            let json = try! JSONSerialization.jsonObject(with: data, options: [])
            //print(json)

            if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
                taskCallback(true, json as AnyObject?)
            } else {
                taskCallback(false, json as AnyObject?)
            }

        })
        task.resume()
    }

我遇到的问题是我想将结果读入字典,遍历它并创建对象。

现在,我会将我的代码放在 executeRequestURL 中以确保它能正常工作,但我打算将此代码与所需的实体分开。

问题:

如何将 resp 作为字典阅读?

谢谢

响应示例如下;

{
  "objects": [
    {
      "uid": "coll_20ce39424470457c925f823fc150b3d4",
      "title": "Popular",
      "temp_image": "",
      "body": "",
      "active": true,
      "slug": "popular",
      "created": "2014-10-25T12:45:54+00:00",
      "modified": "2014-10-25T12:45:54.159000+00:00",
      "ends_on": "2100-01-01T00:00:00+00:00",
    }
  ]
}

最佳答案

由于 JSON 是一个字典,因此从回调中返回一个字典 ([String:Any])。在 Swift 3 中,AnyObject 变成了 Any。 Swift 的强类型系统鼓励尽可能具体。

做一个更好的错误处理!您应该返回一个错误,而不仅仅是 false

代码使用新的 Swift 3 结构 URLURLRequest

private class func executeRequestURL(requestURL: URL, taskCallback: @escaping (Bool, [String:Any]?) -> ()) {
  print ("Attempting URL -- \(requestURL)")

  let request = URLRequest(url: requestURL, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: kAPI_TIMEOUT)

  let session = URLSession.shared


  let task = session.dataTask(with: request, completionHandler: {
    (data, response, error) in

    guard error == nil else {
      print(error)
      taskCallback(false, nil)
      return
    }
    guard let data = data else {
      print("Data is empty")  // <- this will never be reached. If there is no error,
      taskCallback(false, nil) // data is always non-nil.
      return
    }
    if let response = response as? HTTPURLResponse , 200...299 ~= response.statusCode {
      let json = try! JSONSerialization.jsonObject(with: data, options: []) as!  [String:Any]
      taskCallback(true, json)
    } else {
      taskCallback(false, nil)
    }
  })
  task.resume()
}

JSON 结果包含一个字典,其中包含一个键 objects,其中包含一个字典数组。 JSON 集合类型非常容易区分:{} 是字典,[] 是数组。


要将 JSON 映射到对象,请创建一个结构

struct Item {

  var uid : String
  var title : String
  var tempImage : String
  var body : String
  var active : Bool
  var slug : String
  var created : String
  var modified : String
  var endOn : String
}

和一个数组

var items = [Item]()

然后将字典映射到Item

if let objects = json["objects"] as? [[String:Any]] {
  for object in objects {
    let uid = object["uid"] as! String
    var title = object["title"] as! String
    var tempImage = object["temp_image"] as! String
    var body = object["body"] as! String
    var active = object["active"] as! Bool
    var slug = object["slug"] as! String
    var created = object["created"] as! String
    var modified  = object["modified"] as! String
    var endOn  = object["end_on"] as! String
    let item = Item(uid: uid, title: title, tempImage:tempImage, body: body, active: active, slug: slug, created: created, modified: modified, endOn: endOn)
    items.append(item)

  }

JSON 值似乎来自一个始终包含所有字段的数据库,因此强制展开的值是安全的。

关于json - 将回调 Swift JSON AnyObject 转换为 NSDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40358637/

相关文章:

Javascript if else 带有 json 文件

swift - 将 UInt16 转换为 Int16 会发生程序崩溃

swift - 在第一次加载 requestAuthorization 之后,viewDidLoad 的其余部分未执行,下一行跳转到委托(delegate)函数 (swift 3)

ios - 写入文件时尝试加密 NSDictionary

objective-c - 在遍历 NSDictionary 时处理不同的对象类型

python - Pandas -Python : How do you write new lines in Pandas?

javascript - Ratchet WebSocket(失败 : WebSocket opening handshake timed out)

java - 将 JSON 解析为对象

ios - Swift:如何使 UITableViewCell 高度适应其中的 UITextView

ios - 合并 NSArray 和 NSDictionary 的复杂数据结构