Swift 我如何找出编码路径中的哪个元素正是导致快速解码错误的原因?

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

我正在调用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=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