JSON - Swift中的模型+实现

时间:2015-08-07 07:51:40

标签: json swift parsing

我在Swift中观看了很多关于解析JSON的视频,但我还是没有得到它。我试图以正确的方式得到它,意味着异步方式,所以我不会阻止任何事情。我只是对字典中的数组在数组中的字典中非常困惑等等JSON的结构,我不知道如何正确地解析它。

我想了解如何使用Struct或Class作为单独的文件来建模我的应用程序,创建它的实例并在UTTableView中解析JSON。

让我感到困惑的是,我无法了解如何构建所有内容(模型+实现)。

例如,我一直在玩这个JSON http://api.football-data.org/alpha/teams/66/fixtures

我想从该团队的Fixtures中创建一个模型,因此创建一个模型,实现/解析JSON并填充Tableview。

到目前为止我的代码示例:

在我的模型中(这是一个结构)我有这个:

  struct RestApiManager {

    var awayTeamName: NSString
    var homeTeamName: String

    var dateOfTheMatch: NSDate
    var leagueRound: Int

//    var goalsHomeTeam: Int
//    var goalsAwayTeam: Int
//    
//    var clubIcons: String


    init(fixturesDictionary: NSDictionary) {

        let allFixtures = fixturesDictionary["fixtures"] as! NSArray

        awayTeamName = fixturesDictionary["awayTeamName"] as! NSString
        homeTeamName = fixturesDictionary["homeTeamName"] as! String
        dateOfTheMatch = fixturesDictionary["date"] as! NSDate
        leagueRound = fixturesDictionary["matchday"] as! Int


    }

在Viewcontroller中我有这个(因为我只是在测试JSON,如果它正确地返回数据,那么它没有 - 它崩溃并且错误说“致命错误:意外地发现在展开一个可选值时“没有”,我不知道为什么):

let fixturesUrl = NSURL(string: "http://api.football-data.org/alpha/teams/66/fixtures")

    let sharedSession = NSURLSession.sharedSession()
    let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(fixturesUrl!) { (location: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in

        // If there's no errors then unwrap the optional values
        if (error == nil) {

            // Creates a data object based on the information of the "location"
            let dataObject = NSData(contentsOfURL: location) // "location" is the file that's stored on the disk

            // Convert the dataObject into a JSON object
            let fixturesDictionary = NSJSONSerialization.JSONObjectWithData(dataObject!, options: nil, error: nil) as! NSDictionary

            // Instance of RestApiManager 

            let restApiManager = RestApiManager(fixturesDictionary: fixturesDictionary)

            println(restApiManager.dateOfTheMatch)

        }

    }

    downloadTask.resume()

如果有人能告诉我,我将如何感激。

3 个答案:

答案 0 :(得分:0)

解析数据的最佳方法是使用在线工具。

例如 http://www.jsoneditoronline.org/

您的型号:

因此,您的init()方法将如下所示

init(fixturesDictionary: NSDictionary) {

    let allFixtures = fixturesDictionary["fixtures"] as! NSArray
    for index in 0..<allFixtures.count{
         awayTeamName = fixturesDictionary[index]["awayTeamName"] as! NSString
         homeTeamName = fixturesDictionary[index]["homeTeamName"] as! String
         dateOfTheMatch = fixturesDictionary[index]["date"] as! String
         leagueRound = fixturesDictionary[index]["matchday"] as! Int
     }
}

答案 1 :(得分:0)

JSON数据不能包含NSDate对象。它包含:NSDictionary,NSArray,NSString,NSNumber(用于数字和布尔值)和NSNull。您必须查看收到的数据,以找出服务器用于向您报告日期的格式,并添加代码以将字符串转换为日期。

除此之外,我真的希望您知道每当JSON数据与您使用时的预期不符时! ,你的应用程序将崩溃。因为那是什么!意思是:“请转换给我,如果它不起作用,请崩溃”。

答案 2 :(得分:0)

根据http://www.json4swift.com

的JSON生成的模型
let fixturesUrl = NSURL(string: "http://api.football-data.org/alpha/teams/66/fixtures")
let sharedSession = NSURLSession.sharedSession()
var fixtures : Array

let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(fixturesUrl!) { (location: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in

    // If there's no errors then unwrap the optional values
    if (error == nil) {

        // Creates a data object based on the information of the "location"
        let dataObject = NSData(contentsOfURL: location) // "location" is the file that's stored on the disk

        // Convert the dataObject into a JSON object
        let fixturesDictionary = NSJSONSerialization.JSONObjectWithData(dataObject!, options: nil, error: nil) as! NSDictionary

//Instantiate fixtures array from fixturesDictionary
     fixtures = Fixtures.modelsFromDictionaryArray(someDictionaryArrayFromJSON)

        println(fixtures[0].date)
        println(fixtures[0].homeTeamName)


    }

}

downloadTask.resume()

这就是它。