Swift中字典转结构体遇阻,请求MessageKit适配协助
解决Swift中[String, Any]字典转Codable结构体适配MessageKit的问题
问题核心
自定义Codable结构体与API返回的JSON键名不匹配,且未完成[String:Any]到Data的正确转换,导致解析失败。
解决方案步骤
1. 修正结构体的JSON键映射
API返回的JSON采用下划线命名(如parent_chat),而Swift结构体使用驼峰命名(parentChat)。通过设置JSONDecoder的键解码策略可自动适配,无需手动编写CodingKey:
let decoder = JSONDecoder() // 自动将JSON下划线命名转换为Swift驼峰命名 decoder.keyDecodingStrategy = .convertFromSnakeCase
2. 完成[String:Any]到Data的转换
Codable解析依赖Data类型,需先将字典转成Data:
// 假设apiResponse是接口返回的[String:Any]字典 guard let jsonData = try? JSONSerialization.data(withJSONObject: apiResponse, options: []) else { print("字典转Data失败") return }
3. 执行解析并处理错误
do { let response = try decoder.decode(Response.self, from: jsonData) // 解析成功,获取聊天数据数组response.parentChat } catch { print("解析错误:\(error.localizedDescription)") // 打印详细错误定位问题(如键不匹配、类型不兼容) print("详细错误信息:\(error)") }
4. 适配MessageKit展示
将ParentChat转换为符合MessageType协议的结构体,满足MessageKit的展示要求:
// 定义符合SenderType协议的发送者结构体 struct ChatSender: SenderType { let senderId: String let displayName: String } // 定义符合MessageType的聊天消息结构体 struct ChatMessage: MessageType { let sender: SenderType let messageId: String let sentDate: Date let kind: MessageKind init(from parentChat: ParentChat) { self.sender = ChatSender(senderId: "\(parentChat.sender_type)", displayName: parentChat.sender_name) self.messageId = "\(parentChat.id)" // 根据API返回的chat_time格式配置DateFormatter let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" // 需与API返回的时间格式一致 self.sentDate = dateFormatter.date(from: parentChat.chat_time) ?? Date() self.kind = .text(parentChat.message) } } // 将解析后的数组转换为MessageKit可用的消息数组 let messageKitMessages = response.parentChat.map { ChatMessage(from: $0) }
报错说明
截图中的错误源于JSON键名与结构体属性名不匹配,设置keyDecodingStrategy = .convertFromSnakeCase即可解决该问题。
内容的提问来源于stack exchange,提问作者Ankit Tale
相关产品推荐
相关产品推荐

