Ios 如何使用Swift解决JSON编码类型不匹配解码错误
我使用Ios 如何使用Swift解决JSON编码类型不匹配解码错误,ios,json,swift,Ios,Json,Swift,我使用Codable方法获取JSON数据。在这里,在我的JSON响应中,大多数值作为字符串接收,但有时它接收Int。那时候我得到了如下的解码错误 类型不匹配(Swift.String、Swift.DecodingError.Context(编码路径: [编码键(stringValue:“数据”,intValue:无), 编码键(stringValue:“状态”,intValue:nil)],调试说明: “应解码字符串,但找到了一个数字。”, 参考误差:零) 可编码的 // MARK: - Wel
Codable
方法获取JSON
数据。在这里,在我的JSON响应中,大多数值作为字符串接收,但有时它接收Int
。那时候我得到了如下的解码错误
类型不匹配(Swift.String、Swift.DecodingError.Context(编码路径:
[编码键(stringValue:“数据”,intValue:无),
编码键(stringValue:“状态”,intValue:nil)],调试说明:
“应解码字符串,但找到了一个数字。”,
参考误差:零)
可编码的
// MARK: - Welcome
struct Welcome: Codable {
let status: Bool
let data: DataClass
}
// MARK: - DataClass
struct DataClass: Codable {
let memberID, groupID, memberName, dataDescription: String
let duedate, team, member: String
let membergroup: JSONNull?
let teams, category, junction, grouptype: String
let typegroup, groupMethod, memberCD, checklist: String
let refID, startDate, createdBy, createdDate: String
let startedBy: JSONNull?
let startedDate: String
let submittedBy, submittedDate, completedBy: JSONNull?
let completedDate, extendDate: String
let editedBy: JSONNull?
let editedDate: String
let status: Int
let autotask, isdelete, timestamp, assignedMember: String
let teamName, gemID, gemName, ticketName: String
let ticketTypeName, ableToDelete, assignedForMe, priorityFlag: String
let taskTypeFlag: String
let comments, notification, reminder: [JSONAny]
let acceptOrDecline: String
let availableStatus: [AvailableStatus]
let editedUserName: String
enum CodingKeys: String, CodingKey {
case memberID = "member_id"
case groupID = "group_id"
case memberName = "member_name"
case dataDescription = "description"
case duedate, team, member, membergroup, teams, category, junction, grouptype, typegroup
case groupMethod = "group_method"
case memberCD = "member_cd"
case checklist
case refID = "ref_id"
case startDate = "start_date"
case createdBy = "created_by"
case createdDate = "created_date"
case startedBy = "started_by"
case startedDate = "started_date"
case submittedBy = "submitted_by"
case submittedDate = "submitted_date"
case completedBy = "completed_by"
case completedDate = "completed_date"
case extendDate = "extend_date"
case editedBy = "edited_by"
case editedDate = "edited_date"
case status, autotask, isdelete, timestamp
case assignedMember = "assigned_member"
case teamName = "team_name"
case gemID = "gem_id"
case gemName = "gem_name"
case ticketName = "ticket_name"
case ticketTypeName = "ticket_type_name"
case ableToDelete = "able_to_delete"
case assignedForMe = "assigned_for_me"
case priorityFlag = "priority_flag"
case taskTypeFlag = "task_type_flag"
case comments, notification, reminder
case acceptOrDecline = "accept_or_decline"
case availableStatus = "available_status"
case editedUserName = "edited_user_name"
}
}
// MARK: - AvailableStatus
struct AvailableStatus: Codable {
let id: Int
let name, displayName, icon: String
enum CodingKeys: String, CodingKey {
case id, name
case displayName = "display_name"
case icon
}
}
您可以这样做:
// MARK: - Welcome
class Welcome: Codable {
let status: Bool
let data: DataClass
}
// MARK: - DataClass
class DataClass: Codable {
let memberID, groupID, memberName, dataDescription: String
let duedate, team, member: String
let membergroup: JSONNull?
let teams, category, junction, grouptype: String
let typegroup, groupMethod, memberCD, checklist: String
let refID, startDate, createdBy, createdDate: String
let startedBy: JSONNull?
let startedDate: String
let submittedBy, submittedDate, completedBy: JSONNull?
let completedDate, extendDate: String
let editedBy: JSONNull?
let editedDate: String
let status: Int
let autotask, isdelete, timestamp, assignedMember: String
let teamName, gemID, gemName, ticketName: String
let ticketTypeName, ableToDelete, assignedForMe, priorityFlag: String
let taskTypeFlag: String
let comments, notification, reminder: [JSONAny]
let acceptOrDecline: String
let availableStatus: [AvailableStatus]
let editedUserName: String
enum CodingKeys: String, CodingKey {
case memberID = "member_id"
case groupID = "group_id"
case memberName = "member_name"
case dataDescription = "description"
case duedate, team, member, membergroup, teams, category, junction, grouptype, typegroup
case groupMethod = "group_method"
case memberCD = "member_cd"
case checklist
case refID = "ref_id"
case startDate = "start_date"
case createdBy = "created_by"
case createdDate = "created_date"
case startedBy = "started_by"
case startedDate = "started_date"
case submittedBy = "submitted_by"
case submittedDate = "submitted_date"
case completedBy = "completed_by"
case completedDate = "completed_date"
case extendDate = "extend_date"
case editedBy = "edited_by"
case editedDate = "edited_date"
case status, autotask, isdelete, timestamp
case assignedMember = "assigned_member"
case teamName = "team_name"
case gemID = "gem_id"
case gemName = "gem_name"
case ticketName = "ticket_name"
case ticketTypeName = "ticket_type_name"
case ableToDelete = "able_to_delete"
case assignedForMe = "assigned_for_me"
case priorityFlag = "priority_flag"
case taskTypeFlag = "task_type_flag"
case comments, notification, reminder
case acceptOrDecline = "accept_or_decline"
case availableStatus = "available_status"
case editedUserName = "edited_user_name"
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
memberID = try values.decodeIfPresent(String.self, forKey: .memberID)
groupID = try values.decodeIfPresent(String.self, forKey: .groupID)
//...... etc.
}
}
// MARK: - AvailableStatus
class AvailableStatus: Codable {
let id: Int
let name, displayName, icon: String
enum CodingKeys: String, CodingKey {
case id, name
case displayName = "display_name"
case icon
}
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
id = try values.decodeIfPresent(Int.self, forKey: .id)
//...... etc.
}
}
很难说。检查JSON响应,您声明的其中一个字符串键不是JSON@TejaNandamuri我的问题是可以使用键进行编码,该键有时是字符串,有时是Int
。但从服务器上我们给出了所有字符串。如何处理?我在可编码结构中犯了什么错误吗?但是发布的json起作用了,你能举个例子说明什么时候出错吗?@Joakim DanielsontypeMismatch(Swift.String,Swift.DecodingError.Context(codingPath:[CodingKeys(stringValue:“data”,intValue:nil),CodingKeys(stringValue:“team”,intValue:nil)],debugDescription:“本应解码字符串,但找到了一个数组。”,underyingError:nil))
但我仍然遇到了一些问题。我的意思是发布json,而不是错误,但如果您在所有可能类型的值上都遇到错误,则可能是服务器出现故障。“但从服务器上,我们提供了所有字符串。”,这是否意味着它是您自己的服务器应用程序?非常感谢您回答我这个问题。顺便说一句。。。。。。etc->这意味着我需要用try right列出所有值?此解决方案处理空值,但不处理可以具有不同类型的值,例如Int或String@JordyGonzalez在非类类型“DataClass”中的init->“required”初始值设定项处出错
对不起,我忘了将“struct”更改为“class”,如果您更改此选项,则更简单的解决方案是删除required
关键字。