You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中嵌套JSON解码解析:日期字段结构体设计求助

解决JSON解析中的日期字段处理及列表存储问题

首先修正你的结构体定义,贴合Swift编码规范与需求:

  • Swift结构体名称遵循大驼峰命名,将flightsPost改为FlightsPost、flightDate改为FlightDate
  • 你需要将数据存入列表,说明JSON里的data是数组类型,因此结构体中data应定义为[FlightDate]而非单个对象
  • 将日期字段类型从String改为Date,便于后续日期相关逻辑处理

修正后的结构体代码:

struct FlightsPost: Codable {
    var data: [FlightDate]
}

struct FlightDate: Codable {
    var origin: String
    var destination: String
    var price: Int
    var airline: String
    var flight_number: String
    var departure_at: Date
    var return_at: Date
    var transfers: String
    var expires_at: Date
}

接下来处理日期字段的解码:
JSON中的日期字符串多为ISO 8601格式(例如2024-05-20T14:30:00Z),我们可以自定义日期格式化器,在解码时指定使用该格式化器解析日期:

完整解码示例代码:

// 创建适配ISO 8601格式的日期格式化器
let dateFormatter = ISO8601DateFormatter()
dateFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]

// 配置JSON解码器的日期解码策略
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dateFormatter)

// 假设你已获取到JSON数据(比如从文件/网络请求得到的Data对象)
do {
    let flightsPost = try decoder.decode(FlightsPost.self, from: jsonData)
    // flightsPost.data就是你需要的航班列表
    print(flightsPost.data)
} catch {
    print("解码失败:\(error)")
}

如果JSON中的日期格式是非标准ISO 8601,可自定义格式化器的匹配规则,例如:

let customDateFormatter = DateFormatter()
customDateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
customDateFormatter.locale = Locale(identifier: "en_US_POSIX")
customDateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

注意事项:

  • 日期格式化器的格式必须与JSON中的日期字符串完全匹配,否则会解码失败
  • 若JSON中存在可选日期字段,需将结构体对应字段改为可选类型(如var departure_at: Date?)

内容的提问来源于stack exchange,提问作者Medet Dönmez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:20:26