如何将这种类型的数据解析为Swift中的JSON?

How to parse this type of data to a JSON in Swift?

我调用了一个API来获取一年中的所有假期,结果是Json类型。但我只能像下面那样提取它(它是“项目”的众多元素之一)

"items": [
  {
   "kind": "calendar#event",
   "etag": "\"3235567993214000\"",
   "id": "20200101_1814eggq09ims8ge9pine82pclgn49rj41262u9a00oe83po05002i01",
   "status": "confirmed",
   "htmlLink": "https://www.google.com/calendar/event?eid=MjAyMDAxMDFfMTgxNGVnZ3EwOWltczhnZTlwaW5lODJwY2xnbjQ5cmo0MTI2MnU5YTAwb2U4M3BvMDUwMDJpMDEgZW4udWsjaG9saWRheUB2",
   "created": "2021-04-07T08:26:36.000Z",
   "updated": "2021-04-07T08:26:36.607Z",
   "summary": "New Year's Day",
   "creator": {
    "email": "en.uk#holiday@group.v.calendar.google.com",
    "displayName": "Holidays in United Kingdom",
    "self": true
   },
   "organizer": {
    "email": "en.uk#holiday@group.v.calendar.google.com",
    "displayName": "Holidays in United Kingdom",
    "self": true
   },
   "start": {
    "date": "2020-01-01"
   },
   "end": {
    "date": "2020-01-02"
   },
   "transparency": "transparent",
   "visibility": "public",
   "iCalUID": "20200101_1814eggq09ims8ge9pine82pclgn49rj41262u9a00oe83po05002i01@google.com",
   "sequence": 0,
   "eventType": "default"
  },
  {
   "kind": "calendar#event",
   "etag": "\"3235567993214000\"",
   "id": "20200412_1814eggq09ims8gd8lgn6t35e8g56tbechgniag063i0ue048064g0g",
   "status": "confirmed",
   "htmlLink": "https://www.google.com/calendar/event?eid=MjAyMDA0MTJfMTgxNGVnZ3EwOWltczhnZDhsZ242dDM1ZThnNTZ0YmVjaGduaWFnMDYzaTB1ZTA0ODA2NGcwZyBlbi51ayNob2xpZGF5QHY",
   "created": "2021-04-07T08:26:36.000Z",
   "updated": "2021-04-07T08:26:36.607Z",
   "summary": "Easter Sunday",
   "creator": {
    "email": "en.uk#holiday@group.v.calendar.google.com",
    "displayName": "Holidays in United Kingdom",
    "self": true
   },
   "organizer": {
    "email": "en.uk#holiday@group.v.calendar.google.com",
    "displayName": "Holidays in United Kingdom",
    "self": true
   },
   "start": {
    "date": "2020-04-12"
   },
   "end": {
    "date": "2020-04-13"
   },
   "transparency": "transparent",
   "visibility": "public",
   "iCalUID": "20200412_1814eggq09ims8gd8lgn6t35e8g56tbechgniag063i0ue048064g0g@google.com",
   "sequence": 0,
   "eventType": "default"
  }

我尝试获取键“start”和键“summary”中的值,但我做不到。

Xcode 告诉我“项目”是 __NSArrayI 类型。

到目前为止我尝试的是创建一个像这样简单的class(只是先尝试​​使用,所以我没有制作所有变量)

class API_Info {
var kind: String?
var etag: String?
var id: String?
var status: String?
var htmlLink: String?
var created: String?
var updated: String?
var summary: String?

init(items: [String:Any]){
    self.kind = items["kind"] as? String
    self.etag = items["etag"] as? String
    self.id = items["id"] as? String
    self.status = items["status"] as? String
    self.htmlLink = items["htmlLink"] as? String
    self.created = items["created"] as? String
    self.updated = items["updated"] as? String
    self.summary = items["summary"] as? String
 }
}

我这样解析:

guard let items = json!["items"]! as? [API_Info] else{
                print("null")
            return
        }

这样else语句就是运行.

我做错了什么,我怎样才能得到我想要的数据?

提前致谢。

Codable 是这里的解决方案。下面是我使用的结构而不是你的 class

struct ApiInfo: Codable {
    let kind: String
    let etag: String
    let id: String
    let status: String
    let htmlLink: String
    let created: Date 
    let updated: Date
    let summary: String
}

然后我创建了一个根类型来保存数组

struct Result: Codable {
    let items: [ApiInfo]
}

然后解码

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)

do {
    let result = try decoder.decode(Result.self, from: data)
    print(result.items)
} catch {
    print(error)
}

请注意,数据值被解码为 Date 个对象。 您可以选择跳过根类型并解码为字典

do {
    let items = try decoder.decode([String: [ApiInfo]].self, from: data)
    if let values = items["items"] {
        print(values)
    }
} catch {
    print(error)
}