首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Swift中解析并返回响应中的所有json数据?

如何在Swift中解析并返回响应中的所有json数据?
EN

Stack Overflow用户
提问于 2018-06-02 06:04:56
回答 1查看 325关注 0票数 0
代码语言:javascript
复制
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"
    }
}

我正在尝试获取fixture数据,特别是家庭名称、离家名称和时间。下面是我用来获取数据的调用:

代码语言:javascript
复制
    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()
}

JSON响应如下所示:

代码语言:javascript
复制
{
"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
}

我成功地解析了数据,但只返回了一个fixture -我认为这是因为我指定的索引为'‘。

代码语言:javascript
复制
 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
}

如何接收返回的每个fixture的所有家庭姓名、离家姓名和时间?最好的方法是什么?-我试着改变解析函数,但是没有成功。

谢谢:)

EN

回答 1

Stack Overflow用户

发布于 2018-06-02 06:15:12

如果您使用Codable而不是自己序列化数据,您可以尝试

代码语言:javascript
复制
 struct LiveScores : Codable 
 {
    let success : Bool
    let data: InnerObjc

 }

 struct InnerObjc: Codable 
 {
     let fixtures: [Fixture]
     let nextPage:String
     let prevPage:Bool

      enum CodingKeys : String, CodingKey {
        case fixtures = "fixtures"
        case nextPage = "next_page"
        case prevPage = "prev_page"
    }
 }

 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"
    }
 }

//

代码语言:javascript
复制
case 200: // perfecto!

    do {

       let myResult = try JSONDecoder().decode(LiveScores.self, from: data!)    
        print(myResult.data.fixtures)

      }
      catch {
      }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50651492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档