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 Danielson
typeMismatch(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
关键字。