Swift-Codable协议

作者: CoderCurtis | 来源:发表于2020-04-17 17:41 被阅读0次

Swift4新特性中,Codable协议真的能狂吸一波粉,个人不太喜欢SwiftyJSON这类的第三方库来解析数据,if let xxx = 方式也太繁琐了。

个人使用Alamofire库,封装自身项目网络框架,使用responseJSON返回JSON数据(或许有同学疑问,为什么不直接使用responseData返回data数据,个人觉得请求的某些数据没必要解析为模型,直接用就可以)

Alamofire.request(url, method: httpMethod, parameters: paramters, encoding: URLEncoding.default, headers: header).responseJSON

例子1: JSON数组

  • 每个属性都需要可选类型(?)接收,否则,若没有该属性,解析失败;
  • 每个属性的类型都需要准确,否则解析失败;
struct MajorDetailBasicFields: Codable {
    
    var level2: String? // : 27,
    var level1: String? // : 2,
    var limit_year: String? // : 三年,
    var special_id: String? // : 853,
    var level2_name: String? // : 财经商贸大类,
    var degree: String? // : ,
    var view_week: String? // : 49,
    var view_total: String? // : 20763,
    var level3_name: String? // : 金融类,
    var rank: String? // : 244,
    var rankall: String? // : 167,
    var sid: String? // : gkspecial853,
    var level3: String? // : 194,
    var level1_name: String? // : 专科,
    var rank_type: String? // : 2,
    var name: String? // : 金融管理,
    var view_month: String? // : 65
}

struct MajorDetailBasic: Codable {
    
    var model: String? // : gaokao.eolmajorlist,
    var pk: String? // : 1d87f2c05f02c1b45de804be0f247524,
    var fields: MajorDetailBasicFields? // : {
}

解析

guard let data = try? JSONSerialization.data(withJSONObject: result as Any, options: .prettyPrinted) else {
    return
}
            
guard let list = try? JSONDecoder().decode([MajorDetailBasic].self, from: data) else {
     return
}

至此,解析成功后,list中就是一个个MajorDetailBasic对象

例子2: JSON字典

依然是:

  • 每个属性都需要可选类型(?)接收,否则,若没有该属性,解析失败;
  • 每个属性的类型都需要准确,否则解析失败;
struct CollegeDetailInfo: Codable {
    
    var site: String? // : http://zs.gzpyp.edu.cn,
    var level_name: String? // : 
    var school_nature_name: String? // : 公办,
    var address: String? // 
    var content: String? // 
    var phone: String? // : 020-34874086,020-84731206,
}

解析

guard let data = try? JSONSerialization.data(withJSONObject: result as Any, options: .prettyPrinted) else {
    return
 }
            
guard let info = try? JSONDecoder().decode(CollegeDetailInfo.self, from: data) else {
    return
}

例子3: 自定义键值名

假如例子2中的属性phone我们想使用phoneNum表达,则该模型如下

struct CollegeDetailInfo: Codable {
    
    var site: String? // : http://zs.gzpyp.edu.cn,
    var level_name: String? // : 专科(高职),
    var school_nature_name: String? // : 公办,
    var address: String? // 
    var content: String? // 
    var phoneNum: String? // : 020-34874086,020-84731206,
    
    ///自定义键值名
    enum CodingKeys: String, CodingKey {
        case phoneNum = "phone"
        case site
        case level_name
        case school_nature_name
        case address
        case content
    }
}

PS: 虽然只是将phone->phoneNum 其他字符也需要在这里列一遍,否则转换失败

相关文章

  • Swift-Codable协议

    Swift4新特性中,Codable协议真的能狂吸一波粉,个人不太喜欢SwiftyJSON这类的第三方库来解析数据...

  • Swift-Codable详情

    Codable是Swift 4.0 之后苹果增加的,Codable是Encodable和Decodable协议的类...

  • git协议

    git支持的协议 local协议 https协议 ssh协议 git协议 github常用的协议

  • Dubbo服务 上传文件解决方案以及Hessian协议

    协议支持Dubbo支持多种协议,如下所示: Dubbo协议 Hessian协议 HTTP协议 RMI协议 WebS...

  • Procotol 和 Delegate

    目录 Procotol 协议的概念 协议的分类 协议的定义 协议的遵循 协议的方法 协议的属性 Delegate ...

  • 计算机网络题目

    几种协议分别属于哪一层传输层协议:TCP协议、UDP协议应用层协议:FTP、HTTP、SMTP网络层协议:IP协议...

  • ARP协议

    地址解析协议ARP 网络层四大协议:ARP协议,IP协议,ICMP协议,IGMP协议。 ARP(Address R...

  • IP数据报格式

    前言 先回顾一下TCP/IP协议栈 网络层的协议有IP协议、ARP协议、ICMP协议和IGMP协议。其中IP协议是...

  • 名词解析

    网络层:IP协议 : 网络协议ICMP协议: Internet互联网控制报文协议 ->IP协议的附属协议 IP...

  • 如何将Git仓库备份到本地

    git常用的传输协议传输协议.png哑协议:哑协议传输进度不可见;智能协议传输可见。传输速度:智能协议比哑协议传输...

网友评论

    本文标题:Swift-Codable协议

    本文链接:https://www.haomeiwen.com/subject/ztmyvhtx.html