解析 JSON Swift 4
这个想法是获取 Facebook 页面的所有事件,但我不想使用 Facebook API。问题是它不解析。以下是可能帮助您理解问题的所有文件和代码:
从 URL 我得到这个 JSON 数据:
{
"events": {
"data": [
{
"description": "Les groupes Do Lung, BROKEN CASH MACHINE et Hobe font aussi leur rentrée en septembre ! Venez très nombreux à ce magnifique concert au Quartier Général d'Oberkampf à 20h30 ! Do Lung entame la soirée avec un set de 45min endiablé, la soirée enchaîne avec BROKEN CASH MACHINE pour une heure de Post-Rock et enfin Hobe fini la soirée avec un son rock alternatif.
Le lieu : https://www.facebook.com/QuartierGeneralOberkampf/",
"end_time": "2017-09-22T00:00:00+0200",
"name": "Concert au Quartier Général d'Oberkampf !",
"place": {
"name": "Quartier Général Oberkampf",
"location": {
"city": "Paris",
"country": "France",
"latitude": 48.865731081726,
"longitude": 2.3771667480469,
"street": "103 Rue Oberkampf",
"zip": "75011"
},
"id": "581262352022480"
},
"start_time": "2017-09-21T20:30:00+0200",
"id": "463762790669327"
}
],
"paging": {
"cursors": {
"before":"QVFIUnBKbUFfSFl",
"after": "QVFIUlFWMWFUTWt6ZAWxRRW16c"
}
}
},
"id": "757545174356489"
}
如果位置不完美,请见谅。但我很确定你得到了代码。我也只放了一个事件。但data[]中有很多。
我在 Swift 中的所有结构:
struct requestEvent: Decodable {
var events: Events
var id: String
}
struct Events: Decodable {
var eventList: [Event]
var paging: Paging
private enum CodingKeys: String, CodingKey {
case eventList = "data"
case paging
}
}
struct Paging: Decodable {
var cursors: Cursors
}
struct Cursors: Decodable {
var before: String
var after: String
private enum CodingKeys: String, CodingKey {
case before
case after
}
}
struct Event: Decodable {
var description: String
var endTime: String
var name: String
var place: Place
var startTime: String
var id: String
private enum CodingKeys: String, CodingKey {
case description
case endTime = "end_time"
case name
case place
case startTime = "start_time"
case id
}
}
struct Place: Decodable {
var name: String
var location: Location
var id: String
}
struct Location: Decodable {
var city: String
var country: String
var latitude: Float?
var longitude: Float?
var street: String
var zip: String
}
最后是我的代码
guard let Request = try? JSONDecoder().decode(requestEvent.self,
from: cleanData) else {
print("Couldn't Parse data")
return
}
好吧,我知道这有点长,但我真的需要帮助。这对你们大多数人来说可能很容易。
当然,当我启动应用程序时,我收到“无法解析数据”,并且我知道“数据”具有良好的数据,因为我每次都打印它。
编辑
我添加了“?”到 struct place 的 id 和位置。而且看起来效果很好。感谢您的回答,但这对我来说很神秘,哈哈!
最佳答案
您的 JSON 格式错误。描述字段中间的换行符无效(将其替换为 \n
)。
该值或描述值未终止,并且 Le lieu
键未正确引用。
并停止丢弃抛出的错误。
do
{
let request = try JSONDecoder().decode(requestEvent.self, from: cleanData)
}
catch
{
print("Couldn't Parse data because... \(error)")
}
会打印一条可能有助于调试的错误消息。
关于ios - 无法使用 Swift Decodable 解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49281700/