我在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()
如果有人能告诉我,我将如何感激。
答案 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)
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()
这就是它。