如何解析和返回Swift中响应的所有json数据?
我正在尝试获取夹具数据,特别是家里的名字、客场的名字和时间。以下是我用来获取数据的调用:如何解析和返回Swift中响应的所有json数据?,json,swift,api,Json,Swift,Api,我正在尝试获取夹具数据,特别是家里的名字、客场的名字和时间。以下是我用来获取数据的调用: struct LiveScores { let result: Bool let data: String let fixtures: [Fixture] struct Fixture : Codable { var kickOffTime: String var homeTeam: String var awayTeam:
struct LiveScores {
let result: Bool
let data: String
let fixtures: [Fixture]
struct Fixture : Codable {
var kickOffTime: String
var homeTeam: String
var awayTeam: String
}
enum CodingKeys : String, CodingKey {
case homeTeam = "home_name"
case awayTeam = "away_name"
case kickOffTime = "time"
}
}
JSON响应如下所示:
func fetchFixtures() {
let session = URLSession.shared
let url = URL(string: "\(baseUrl)fixtures/matches.json?key=\(apiKey)&secret=\(apiSecret)&date=2018-06-01")
let task = session.dataTask(with: url!) { data, response, err in
// check for a hard error
if let error = err {
NSLog("Live Scores Api Error: \(error)")
}
// check the response code
if let httpResponse = response as? HTTPURLResponse {
switch httpResponse.statusCode {
case 200: // perfecto!
if let fixture = self.fixtureFromJSONData(data!) {
NSLog("\(fixture)")
}
case 401: // unauthorised
NSLog("Live Score Api returned an 'unauthorised' response.")
default:
NSLog("Live Scores Api returned response: %d %@", httpResponse.statusCode, HTTPURLResponse.localizedString(forStatusCode: httpResponse.statusCode))
}
}
}
task.resume()
}
我成功地解析了数据,但只返回了一个fixture-我假设这是因为我指定了索引“[0]”
{
"success": true,
"data": {
"fixtures": [
{
"date": "2017-10-16",
"time": "00:30:00",
"round": "999",
"home_name": "Santos Laguna",
"away_name": "Atlas",
"location": "",
"league_id": "88"
},
{
"date": "2017-10-16",
"time": "00:30:00",
"round": "999",
"home_name": "O'Higgins",
"away_name": "Audax Italiano",
"location": "",
"league_id": "63"
},
{
"date": "2017-10-16",
"time": "00:30:00",
"round": "999",
"home_name": "Colorado Rapids",
"away_name": "Real Salt Lake",
"location": "",
"league_id": "94"
}
],
"next_page": "http:\/\/livescore-api.com\/api-client\/fixtures\/matches.json?key=demo_key&secret=demo_secret&page=2",
"prev_page": false
}
如何接收返回的每个赛程的所有本名、客场名和时间?最好的方法是什么我试图更改解析函数,但没有成功
谢谢:)如果您使用的是
Codable
不要自己序列化数据,可以试试吗
func fixtureFromJSONData(_ data: Data) -> LiveScores.Fixture? {
typealias JSONDict = [String:AnyObject]
let json : JSONDict
do {
json = try JSONSerialization.jsonObject(with: data, options: []) as! JSONDict
} catch {
NSLog("JSON parsing failed: \(error)")
return nil
}
var jsonData = json["data"] as! [String:Any]
var fixtureList = jsonData["fixtures"] as! [JSONDict]
var fixtureDict = fixtureList[0]
let fixture = LiveScores.Fixture(
kickOffTime: fixtureDict["time"] as! String,
homeTeam: fixtureDict["home_name"] as! String,
awayTeam: fixtureDict["away_name"] as! String
)
return fixture
}
//
只需使用数据从
Codable
获取结果即可
所以你的模型应该是这样的:
型号:
case 200: // perfecto!
do {
let myResult = try JSONDecoder().decode(LiveScores.self, from: data!)
print(myResult.data.fixtures)
}
catch {
}
import Foundation
struct LiveScores: Codable {
let success: Bool
let fixturesData: FixturesData?
enum CodingKeys: String, CodingKey {
case fixturesData = "data"
case success
}
}
struct FixturesData: Codable {
let fixtures: [Fixture]
let nextPage, prevPage: Bool
enum CodingKeys: String, CodingKey {
case fixtures
case nextPage = "next_page"
case prevPage = "prev_page"
}
}
struct Fixture: Codable {
let id, date, time, round: String
let homeName, awayName, location, leagueID: String
let homeID, awayID: Int?
enum CodingKeys: String, CodingKey {
case id, date, time, round
case homeName = "home_name"
case awayName = "away_name"
case location
case leagueID = "league_id"
case homeID = "home_id"
case awayID = "away_id"
}
}
// MARK: Convenience initializers
extension LiveScores {
init(data: Data) throws {
self = try JSONDecoder().decode(LiveScores.self, from: data)
}
}
您的API:
case 200: // perfecto!
do {
let myResult = try JSONDecoder().decode(LiveScores.self, from: data!)
print(myResult.data.fixtures)
}
catch {
}
import Foundation
struct LiveScores: Codable {
let success: Bool
let fixturesData: FixturesData?
enum CodingKeys: String, CodingKey {
case fixturesData = "data"
case success
}
}
struct FixturesData: Codable {
let fixtures: [Fixture]
let nextPage, prevPage: Bool
enum CodingKeys: String, CodingKey {
case fixtures
case nextPage = "next_page"
case prevPage = "prev_page"
}
}
struct Fixture: Codable {
let id, date, time, round: String
let homeName, awayName, location, leagueID: String
let homeID, awayID: Int?
enum CodingKeys: String, CodingKey {
case id, date, time, round
case homeName = "home_name"
case awayName = "away_name"
case location
case leagueID = "league_id"
case homeID = "home_id"
case awayID = "away_id"
}
}
// MARK: Convenience initializers
extension LiveScores {
init(data: Data) throws {
self = try JSONDecoder().decode(LiveScores.self, from: data)
}
}
在这一点上似乎有错误://如果let error=err{NSLog(“Live Scores Api error:(error)”),请检查是否存在硬错误。}啊,我现在已经设法克服了这个错误。装置返回0个结果/值。我在浏览器中尝试了URL,它返回了2个resultslet fixture=liveScores.fixturesData{请将URL的响应作为Json发送给我{“success”:true,“data”:{“fixtures”:[{“id”:“929506”,“date”:“2018-06-01”,“time”:“00:00:00”,“round”:“999”,“home\u name”:“Miroplast”,“away\u name”:“APR”,“location”:“league\u id”:“373”,“home\u id”:“null”,“away\u id”:“null”,{“id”:“929507”,“日期”:“2018-06-01”,“时间”:“00:00:00”,“回合”:“999”,“主队名”:“Etincelles”,“客队名”:“Bugesera”,“地点”:“联赛id”:“373”,“主队id”:null,“客队id”:null}],“下一页”:false,“上一页”:false}