使用 Swift 4 和 Xcode 9 获取 JSON 数据

Posted

技术标签:

【中文标题】使用 Swift 4 和 Xcode 9 获取 JSON 数据【英文标题】:getting JSON Data with Swift 4 and Xcode 9 【发布时间】:2017-12-07 22:33:26 【问题描述】:

我一直在尝试使用以下代码来获取我的 JSON 数据。它返回“加载后错误”。我在另一个应用程序中使用这个 JSON 数据,它可以工作。我正在尝试使用 Swift 4 实现新的简化方法。代码确实可以工作到打印语句“下载”的位置。

class MortgageRatesVC: UIViewController 
    final let url = URL (string:"http://mortgous.com/JSON/currentRatesJSON.php")

    override func viewDidLoad() 
        super.viewDidLoad()

        downloadJason()
    

    func downloadJason () 
        guard let downloadURL = url else  return 
        URLSession.shared.dataTask(with: downloadURL)  data, urlResponse, error in
            guard let data = data, error == nil, urlResponse != nil else 
                print("Oops Call for Help")
                return
            

            print("downloaded")
            do
            
                let decoder = JSONDecoder()
                let rates = try decoder.decode([LenederRates].self, from: data)
                print(rates)
             catch 
                print("Error after loading")
            
        .resume()
    

class LenederRates: Codable 
    let key : String
    let financial_institution : String
    let variable_rate : String
    let six_months : String
    let one_year : String
    let two_year : String
    let three_year : String
    let four_year : String
    let five_year : String
    //  let date : Date

    init(key: String, financial_institution: String, variable_rate: String, six_months: String, one_year: String, two_year: String, three_year: String, four_year: String, five_year: String) 
        self.key = key
        self.financial_institution = financial_institution
        self.variable_rate = variable_rate
        self.six_months = six_months
        self.one_year = one_year
        self.two_year = two_year
        self.three_year = three_year
        self.four_year = four_year
        self.five_year = five_year
    

【问题讨论】:

你得到的完整错误是什么? 它没有给我一个快速的错误。它只是在我的代码打印错误处停止(“加载后出错”)。我认为它无法读取 JSON! print(error) 添加到您的 catch 分支以检查您遇到的实际错误。 感谢您的回复。我收到错误,无法读取 json 数据中“键”和金融机构值的数据。 需要将解码器dateDecodingStrategy设置为.formatted,并传递一个固定格式的dateFormatter 【参考方案1】:

问题是您的Codable 类中缺少属性日期。您需要将解码器dateDecodingStrategy 设置为.formatted 并传递一个固定格式的dateFormatter。顺便说一句,我建议将您的类更改为结构,使用 Swift 命名约定 camelCase 更改您的属性名称并提供自定义 CodingKeys:

struct LenederRates: Codable 
    let key: String
    let financialInstitution : String
    let variableRate: String
    let sixMonths: String
    let oneYear: String
    let twoYear: String
    let threeYear: String
    let fourYear: String
    let fiveYear: String
    let date: Date
    private enum CodingKeys: String, CodingKey 
        case key, financialInstitution = "financial_institution", variableRate = "variable_rate", sixMonths = "six_months", oneYear = "one_year", twoYear = "two_year", threeYear = "three_year", fourYear = "four_year", fiveYear = "five_year", date
    


let mortgousURL = URL(string:"http://mortgous.com/JSON/currentRatesJSON.php")!
URLSession.shared.dataTask(with: mortgousURL)  data, urlResponse, error in
    guard let data = data else  return 
    do 
        let dateFormat = DateFormatter()
        dateFormat.locale = Locale(identifier: "en_US_POSIX")
        dateFormat.dateFormat = "yyyy-MM-dd"
        let decoder = JSONDecoder()
        decoder.dateDecodingStrategy = .formatted(dateFormat)
        let rates = try decoder.decode([LenederRates].self, from: data)
        print(rates)
     catch 
        print(error)
    
.resume()

【讨论】:

感谢您的大力响应并花时间重新编写代码。我相信你可以看到我是一个新秀。解决编码问题的许多方法让我感到惊讶。再次感谢您! @KevinProctor 您应该将数组声明为表视图控制器的实例属性。如果您在方法中声明它,它将在您的方法完成后立即超出范围。所以在你的表视图控制器中添加声明var rates: [LenederRates] = [](在该方法之外)和数据任务闭包rates = try decoder...中并在下一行重新加载表视图 @KevinProctor 我建议您将问题编辑回滚到原始问题。如果您仍然有问题,我建议您提出一个新问题。 请注意,downloadLenderRates 它已经是[LenederRates] 类型的数组,如果您设置另一个数组[downloadLenderRates],您将创建一个[[LenederRates]] 类型的新对象

以上是关于使用 Swift 4 和 Xcode 9 获取 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

无法让 API 调用及时运行 tableview swift 4 xcode 9

如何使用 Swift 2 + XCode 7 + iOS 9 获取和解析 JSON [重复]

Xcode 存档验证错误 - Xcode 9 和 Swift 4

使用 Xcode 9 和 Swift 4 本地化应用程序的最佳方式是啥?

没有这样的模块 'GoogleSignIn' Xcode 9.3 和 Swift 4.1

Vapor 不适用于 xcode 9 和 swift 4