使用带字典数组的Dictionary进行Swift JSON解析

前端之家收集整理的这篇文章主要介绍了使用带字典数组的Dictionary进行Swift JSON解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是使用 Swift语言进行iOS开发的初学者.我有一个JSON文件包含如下数据.
  1. {
  2. "success": true,"data": [
  3. {
  4. "type": 0,"name": "Money Extension","bal": "72 $","Name": "LK_Mor","code": "LK_Mor","class": "0","withdraw": "300 $","initval": "1000 $"
  5. },{
  6.  
  7. },]
  8. }

我想解析这个文件,并且必须返回包含JSON文件中数据的字典.这是我写的方法.

  1. enum JSONError: String,ErrorType {
  2. case NoData = "ERROR: no data"
  3. case ConversionFailed = "ERROR: conversion from JSON Failed"
  4. }
  5.  
  6. func jsonParserForDataUsage(urlForData:String)->NSDictionary{
  7. var dicOfParsedData :NSDictionary!
  8. print("json parser activated")
  9. let urlPath = urlForData
  10. let endpoint = NSURL(string: urlPath)
  11. let request = NSMutableURLRequest(URL:endpoint!)
  12. NSURLSession.sharedSession().dataTaskWithRequest(request) { (data,response,error) -> Void in
  13. do {
  14.  
  15. guard let dat = data else {
  16. throw JSONError.NoData
  17. }
  18. guard let dictionary: NSDictionary = try NSJSONSerialization.JSONObjectWithData(dat,options:.AllowFragments) as? NSDictionary else {
  19. throw JSONError.ConversionFailed
  20. }
  21.  
  22. print(dictionary)
  23. dicOfParsedData = dictionary
  24.  
  25. } catch let error as JSONError {
  26. print(error.rawValue)
  27. } catch {
  28. print(error)
  29. }
  30. }.resume()
  31.  
  32. return dicOfParsedData
  33.  
  34. }

当我修改方法以返回字典时,它总是返回nil.我该如何修改这个方法.

您无法返回异步任务.你必须使用回调.

像这样添加一个回调:

  1. completion: (dictionary: NSDictionary) -> Void

到您的解析器方法签名:

  1. func jsonParserForDataUsage(urlForData: String,completion: (dictionary: NSDictionary) -> Void)

调用您想要“返回”的数据可用的完成:

  1. func jsonParserForDataUsage(urlForData: String,completion: (dictionary: NSDictionary) -> Void) {
  2. print("json parser activated")
  3. let urlPath = urlForData
  4. guard let endpoint = NSURL(string: urlPath) else {
  5. return
  6. }
  7. let request = NSMutableURLRequest(URL:endpoint)
  8. NSURLSession.sharedSession().dataTaskWithRequest(request) { (data,error) -> Void in
  9. do {
  10.  
  11. guard let dat = data else {
  12. throw JSONError.NoData
  13. }
  14. guard let dictionary = try NSJSONSerialization.JSONObjectWithData(dat,options:.AllowFragments) as? NSDictionary else {
  15. throw JSONError.ConversionFailed
  16. }
  17.  
  18. completion(dictionary: dictionary)
  19.  
  20. } catch let error as JSONError {
  21. print(error.rawValue)
  22. } catch let error as NSError {
  23. print(error.debugDescription)
  24. }
  25. }.resume()
  26.  
  27. }

现在,您可以将此方法与尾随闭包一起使用以获取“返回”值:

  1. jsonParserForDataUsage("http...") { (dictionary) in
  2. print(dictionary)
  3. }

猜你在找的Swift相关文章