Невозможно проанализировать данные JSON из URL-адреса F1 - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь получить доступ к данным JSON, используя следующий URL http://ergast.com/api/f1/1950/driverstandings.json

Теперь я могу получить доступ к данным с помощью следующей функции.

Другими словами, я могу показать данные в консоли. У меня проблема с анализом данных JSON.

Я использую Swifty JSON для анализа данных и по какой-то причине не могу отобразить данные из API. Функция ниже обновляет UILabel на раскадровке.

Любая помощь будет оценена. Ниже приведен весь код проблемы, которую я должен решить. Я хочу добавить, что есть год, по которому в URL появляется UIPickerView в другом представлении. импорт UIKit импорт Alamofire импорт SwiftyJSON

class StandingViewController: UIViewController {


@IBOutlet weak var yearLabel: UILabel!
@IBOutlet weak var firstLabel: UILabel!
@IBOutlet weak var secondLabel: UILabel!
@IBOutlet weak var thirdLabel: UILabel!
@IBOutlet weak var fouthLabel: UILabel!
@IBOutlet weak var fifthLabel: UILabel!


var standing = ""
let standingDataModel = WeatherDataModel()
var currentUrl = ""

let SEASON_URL = "https://ergast.com/api/f1"
//let format = ".json"

override func viewDidLoad() {
    super.viewDidLoad()
    yearLabel.text = standing
    userEnteredNewYear(standing: standing)


    // Do any additional setup after loading the view.
}
//MARK: - Networking
/***************************************************************/

//Write the getStandingData method here:
func getStandingData (url: String) {
    Alamofire.request(url, method: .get).responseJSON {
        response in
        if response.result.isSuccess {
            print("Success we got the data!")
            let standingJSON : JSON = JSON(response.result.value!)
            print(standingJSON)
            self.updateStandingData(json: standingJSON)
        } else {
            print("Error \(String(describing: response.result.error))")
            self.yearLabel.text = "Connection Issues"
        }

    }

}
//Mark: JSON Parsing

func updateStandingData(json: JSON) {
    if case standingDataModel.season = json["MRData"]["StandingsTable"]["season"].intValue {
    standingDataModel.firstDriver = json["DriverStandings"][0]["Driver"]["driverId"].stringValue
        updateUIWithStandingData()
    } else {
        yearLabel.text = "No data available"
    }
}

//Mark user entered data.
func userEnteredNewYear(standing: String) {
    currentUrl = SEASON_URL + "/" + String(standing) + "/driverstandings.json"
    getStandingData(url: currentUrl)

}
func updateUIWithStandingData() {
    yearLabel.text = "\(standingDataModel.season)"
    firstLabel.text = standingDataModel.firstDriver
}

/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destination.
    // Pass the selected object to the new view controller.
}
*/

}

1 Ответ

1 голос
/ 10 марта 2019

Я бы порекомендовал отказаться от SwiftyJSON. Вместо этого создайте реальные объекты модели и используйте встроенный код Swift:

struct F1Data: Codable {
    let mrData: MRData

    enum CodingKeys: String, CodingKey {
        case mrData = "MRData"
    }
}

struct MRData: Codable {
    let xmlns: String
    let series: String
    let url: String
    let limit, offset, total: String
    let standingsTable: StandingsTable

    enum CodingKeys: String, CodingKey {
        case xmlns, series, url, limit, offset, total
        case standingsTable = "StandingsTable"
    }
}

struct StandingsTable: Codable {
    let season: String
    let standingsLists: [StandingsList]

    enum CodingKeys: String, CodingKey {
        case season
        case standingsLists = "StandingsLists"
    }
}

struct StandingsList: Codable {
    let season, round: String
    let driverStandings: [DriverStanding]

    enum CodingKeys: String, CodingKey {
        case season, round
        case driverStandings = "DriverStandings"
    }
}

struct DriverStanding: Codable {
    let position, positionText, points, wins: String
    let driver: Driver
    let constructors: [Constructor]

    enum CodingKeys: String, CodingKey {
        case position, positionText, points, wins
        case driver = "Driver"
        case constructors = "Constructors"
    }
}

struct Constructor: Codable {
    let constructorId: String
    let url: String
    let name: String
    let nationality: String
}

struct Driver: Codable {
    let driverId: String
    let url: String
    let givenName, familyName, dateOfBirth, nationality: String
}

do {
  let f1Data = try JSONDecoder().decode(F1Data.self, from: jsonData)

  let season = f1Data.mrData.standingsTable.season
  let firstDriver = f1Data.mrData.standingsTable.standingsLists[0].driverStandings[0].driver.driverId
} catch {
  print(error)
}
...