Swift 我如何找出编码路径中的哪个元素正是导致快速解码错误的原因?
我正在调用API端点getChatMessages,并按照如下方式解码响应:Swift 我如何找出编码路径中的哪个元素正是导致快速解码错误的原因?,swift,xcode,decodable,Swift,Xcode,Decodable,我正在调用API端点getChatMessages,并按照如下方式解码响应: func getChatMessages(对话:Int,页面大小:Int=10,页面:Int=1,完成:@escaping(Result)->Void){ {…某些网络-配置请求并启动dataTask} 做{ 让dateFormatter:dateFormatter=dateFormatter() dateFormatter.dateFormat=“yyyy-MM-dd HH:MM:ss” let decoder=JS
func getChatMessages(对话:Int,页面大小:Int=10,页面:Int=1,完成:@escaping(Result)->Void){
{…某些网络-配置请求并启动dataTask}
做{
让dateFormatter:dateFormatter=dateFormatter()
dateFormatter.dateFormat=“yyyy-MM-dd HH:MM:ss”
let decoder=JSONDecoder()
decoder.dateDecodingStrategy=.formatted(日期格式化程序)
decoder.keyDecodingStrategy=.custom{codingKeys in
让lastKey=codingKeys.last!
如果lastKey.intValue!=nil | | codingKeys.count!=2{返回lastKey}
如果lastKey.stringValue==“count”| | lastKey.stringValue==“对话参与者”{return lastKey}
返回AnyCodingKey(stringValue:“元素”)!
}
让结果=尝试解码器.decode(ResponseMultipleElements.self,from:data!)
完成(.success(result.detailresponse.element))
}抓住{
打印(“错误为:”,错误)
完成(.failure(.decodingError))
}
}
dataTask.resume()
}
这是一个多元素结构
struct ResponseMultipleElements:可解码{
让状态代码:Int
let响应类型:Int
让错误消息:字符串?
让我们来回答:元素
}
结构元素:可解码{
计数:Int
let元素:T2
让对话参与者:[对话参与者]?
}
结构AnyCodingKey:CodingKey{
var stringValue:String
初始化?(stringValue:String){
self.stringValue=stringValue
}
var intValue:Int?{return nil}
初始化?(intValue:Int){
归零
}
}
最后是我的getChatMessages函数返回的ConversationDetails对象的结构
类会话详细信息:可编码{
var消息:[ChatMessage]?
var对话参与者:[对话参与者]?
}
下面是getChatMessages API调用的响应:
问题:我得到类型不匹配(Swift.Dictionary,Swift.DecodingError.Context(codingPath:[CodingKeys(stringValue:“detailresponse”,intValue:nil),CodingKeys(stringValue:“element”,intValue:nil)],debugDescription:“应该解码字典,但找到了一个数组。”,underyingerror:nil))
现在所有的东西都检查了很多次,但都找不到错误。
我不确定它为哪个元素找到了一个数组而不是预期的数组,所以不知道该修复什么。希望有人能提供帮助。您的
keyDecodingStrategy
告诉解码器将所有只有一个父项的字符串键(不是count
或对话参与者
)视为“元素”。JSON中只有一个这样的键满足此条件-消息
,位于详细响应
下
消息
键将通过以下方式解码:
let element: T2
其中T2
为:
class ConversationDetails: Codable {
var messages: [ChatMessage]?
var conversation_participants: [ConversationParticipants]?
}
但是消息
实际上是JSON中的一个数组
我建议你做的是解码一个ResponseMultipleElements
。这样,T2
实际上就是预期的数组类型
您应该向ConversationDetails
添加初始值设定项,以允许您从一系列聊天信息和参与者中创建ConversationDetails
init(messages: [ChatMessage]?, conversation_participants: [ConversationParticipants]?) {
self.messages = messages
self.conversation_participants = conversation_participants
}
并在getChatMessages
中使用它:
let result = try decoder.decode(ResponseMultipleElements<[ChatMessage]?>.self, from: data!)
let convoDetails = ConversationDetails(
messages: result.detailresponse.element,
conversation_participants: result.detailresponse.conversation_participants
)
completion(.success(convoDetails))
let result=try decoder.decode(ResponseMultipleElements.self,from:data!)
让我们来看一下ConvorDetails=ConversationDetails(
消息:result.detailresponse.element,
对话参与者:result.detailresponse.conversation\u参与者
)
完成(.success(详细信息))
“messages”是一个数组,但元素
属性是一个ConversationDetails