如何用Swift解码嵌套JSON字典?已有基础解码经验求指导
嵌套JSON结构解码实现
步骤1:定义对应嵌套结构的Decodable结构体
首先针对JSON里的members数组元素,定义内部结构体:
struct GroupMemberStruct: Decodable, Hashable { let memberId: String let memberName: String let memberUsername: String let memberType: Int let isMyFriend: Bool let initials: String }
接着定义外层主结构体,包含members数组和其他顶层字段:
struct GroupStruct: Decodable, Hashable { let members: [GroupMemberStruct] let name: String let owner: String let description: String let groupType: Int let expiryDate: Date let readOnly: Bool let isDeleted: Bool let approvalRequired: Bool let joinWithCode: Bool let numberOfMembers: Int let groupAssociation: Int let id: String let etag: String }
步骤2:配置JSONDecoder处理日期格式
JSON中的expiryDate是ISO 8601格式,必须给解码器设置对应策略,否则会解码失败:
let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601
步骤3:修改解码函数逻辑
沿用你之前的请求框架,仅调整解码目标类型即可:
func getGroupDetails(token: String) async throws -> Int { // 替换为你的群组详情接口请求构建逻辑 var request = EndPoints().getGroupDetailsEndPoint() request.httpMethod = "GET" request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") let (data, response) = try await URLSession.shared.data(for: request) let httpResponse = response as? HTTPURLResponse guard (response as? HTTPURLResponse)?.statusCode == 200 else { return httpResponse?.statusCode ?? 0 } let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 let decodedGroup = try decoder.decode(GroupStruct.self, from: data) // 替换为你的群组数据处理逻辑(如更新CoreData) self.updateCoreDataGroupRecords(groupData: decodedGroup) return httpResponse?.statusCode ?? 1000 }
关键说明
- 嵌套JSON解码的核心是分层定义结构体:内层结构体对应JSON中的嵌套对象,外层结构体包含内层结构体的数组/对象字段。
- 如果JSON字段名和Swift变量名不匹配(如下划线命名),可通过
CodingKeys枚举做映射,当前字段名驼峰匹配无需额外处理。 - 日期、数字等特殊类型必须匹配解码规则,否则会抛出解码错误;除了
.iso8601,也可自定义日期格式化器适配非标准格式。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

