使用字典和字典数组进行Swift JSON解析 [英] Swift JSON parsing with Dictionary with Array of Dictionaries

查看:89
本文介绍了使用字典和字典数组进行Swift JSON解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是使用Swift语言进行iOS开发的初学者.我有一个包含以下数据的JSON文件.

I am a beginner in iOS development with Swift language. I have a JSON file contains the data as below.

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

             },
             {

             },
             ]
}   

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

I want to parse this file and have to return the dictionary which contain the data in the JSON file. This is the method I wrote.

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.如何修改此方法.

When I modify this method to return a dictionary, it always return nil. How can I modify this method.

推荐答案

您不能return进行异步任务.您必须改用回调.

You can not return for an asynchronous task. You have to use a callback instead.

添加这样的回调:

completion: (dictionary: NSDictionary) -> Void

解析器方法签名:

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

并在您要返回"的数据可用的地方调用补全:

and call the completion where the data you want to "return" is available:

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()

}

现在,您可以在尾随闭包中使用此方法来获取返回"值:

Now you can use this method with a trailing closure to get the "returned" value:

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

这篇关于使用字典和字典数组进行Swift JSON解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆