我是新手,并且无法理解这一切是如何运作的。
我有这个结构:
struct EventDetail:Decodable {
let EventName: String
let EventInformation: String
let EventStartDate: Date
let EventEndDate: Date
}
这个func下载json:
func downloadJSON(completed: @escaping () -> ()) {
let url = URL(string: "http://someurl.php")
URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error == nil {
do {
self.events = try JSONDecoder().decode([EventDetail].self, from: data!)
DispatchQueue.main.async {
completed()
}
}catch {
print(error)
}
}
}.resume()
}
}
这是我得到的JSON错误:
JSON错误 typeMismatch(Swift.Double,Swift.DecodingError.Context(codingPath:[Foundation。(_ JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue:“Index 0”,intValue:Optional(0)),Cosplay_Life.EventDetail。(CodingKeys in _52013DB7ECF3BE1EBFBF83BE6BA8F9E9).EventStartDate] ,debugDescription:“预计解码Double但发现字符串/数据。”,underlyingError:nil))
如果EventStartDate
和EventEndDate
是一个字符串,这一切似乎都有效,但我希望将它作为Date
,因为我稍后会使用日期字段对数据进行排序。下载的值格式为“yyyy-MM-dd”eks:“2017-02-25”我做错了什么?
答案 0 :(得分:-1)
日期是双倍的,因为它是自纪元以来的毫秒数。
试试这个:
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
// Use format appropriate to your JSON String. This is for ISO-8601
// You MUST account for the milliseconds even if you don't want them
// or it won't parse properly
dateFormatter.dateFormat = "yy-MM-dd'T'HH:mm:ss.SSS"
eventDetail.EventStartDate = dateFormatter.date(from: jsonEventStartDateField)!
eventDetail.EventEndDate = dateFormatter.date(from: jsonEventEndDateField)!