如何解析和返回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}