2016-04-04 76 views
2

我是一个用iOS开发Swift语言的初学者。我有一个JSON文件包含如下的数据。Swift JSON解析字典与字典阵列

{ 
    "success": true, 
    "data": [ 
      { 
       "type": 0, 
       "name": "Money Extension", 
       "bal": "72 $", 
       "Name": "LK_Mor", 
       "code": "LK_Mor", 
       "class": "0", 
       "withdraw": "300 $", 
       "initval": "1000 $" 
      }, 
      { 

      }, 
      { 

      }, 
      ] 
} 

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

enum JSONError: String, ErrorType { 
    case NoData = "ERROR: no data" 
    case ConversionFailed = "ERROR: conversion from JSON failed" 
} 

func jsonParserForDataUsage(urlForData:String)->NSDictionary{ 
    var dicOfParsedData :NSDictionary! 
    print("json parser activated") 
    let urlPath = urlForData 
    let endpoint = NSURL(string: urlPath) 
    let request = NSMutableURLRequest(URL:endpoint!) 
      NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in 
       do { 

        guard let dat = data else { 
         throw JSONError.NoData 
        } 
        guard let dictionary: NSDictionary = try NSJSONSerialization.JSONObjectWithData(dat, options:.AllowFragments) as? NSDictionary else { 
         throw JSONError.ConversionFailed 
        } 

        print(dictionary) 
        dicOfParsedData = dictionary 

       } catch let error as JSONError { 
        print(error.rawValue) 
       } catch { 
        print(error) 
       } 
       }.resume() 

      return dicOfParsedData 

} 

当我修改此方法返回字典时,它总是返回nil。我怎样才能修改这个方法。

+0

什么是错误? –

+0

@BlakeLockley用于定义端点的警戒声明给我错误。我不知道如何解决它 – madhev

+0

也许你的网址路径格式错误?你可以和我们分享吗? –

回答

1

对于异步任务,您不能return。您必须改用回调。

这样一个回调地址:

completion: (dictionary: NSDictionary) -> Void 

到解析器方法签名:

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

,并呼吁在您想要的数据,以“回报”可完成:

func jsonParserForDataUsage(urlForData: String, completion: (dictionary: NSDictionary) -> Void) { 
    print("json parser activated") 
    let urlPath = urlForData 
    guard let endpoint = NSURL(string: urlPath) else { 
     return 
    } 
    let request = NSMutableURLRequest(URL:endpoint) 
    NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in 
     do { 

      guard let dat = data else { 
       throw JSONError.NoData 
      } 
      guard let dictionary = try NSJSONSerialization.JSONObjectWithData(dat, options:.AllowFragments) as? NSDictionary else { 
       throw JSONError.ConversionFailed 
      } 

      completion(dictionary: dictionary) 

     } catch let error as JSONError { 
      print(error.rawValue) 
     } catch let error as NSError { 
      print(error.debugDescription) 
     } 
    }.resume() 

} 

现在,您可以使用此方法与尾部闭包来获取“返回”值:

jsonParserForDataUsage("http...") { (dictionary) in 
    print(dictionary) 
} 
+0

谢谢。它正在工作 – madhev