ios - 无法使用 Swift Decodable 解析 JSON

标签 ios json swift facebook parsing

解析 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/

相关文章:

ios - Mixpanel 设备 token 消失

ios - AWS S3 : file not uploading in folder in ios

ios - 如何在我的 iOS 应用程序中调用 Cloud Code Function(Parse)?

ios - 将持久存储迁移到 iCloud

objective-c - ASIHTTPRequest 和 NSURLRequest 不同的结果

javascript - 如何从 JSON 填充 Backbone 集合

ios - Imageview 图像未正确设置或过滤

json - 如何将本地 json 加载到 List<Map> 变量中?

java - JAXB XML 文件到 JSON

ios - 从另一个 "getDocument"查询中的 "getDocument"查询中检索数据