使用 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 本地化应用程序的最佳方式是啥?