当前位置: 首页 > news >正文

Swift使用编解码库Codable

Codable 是 Swift 引入的全新的编解码库,使开发者更方便的解析JSON 或 plist 文件。支持枚举、结构体和类。

Codable协议定义

Codable代表一个同时符合 Decodable 和 Encodable 协议的类型,即可解码且可编码的类型。

typealias Codable = Decodable & Encodablepublic protocol Decodable {public init(from decoder: Decoder) throws
}public protocol Encodable {public func encode(to encoder: Encoder) throws
}

Codable从 Swift 4 开始引入,包含了 Encoder 和 Decoder 协议和他们的两个实现 JSONEncoder、JSONDecoder 和 PropertyListEncoder、PropertyListDecoder。

其中 Codable 及其相关协议放在了标准库中,而具体的 Encoder、Decoder 类放在了 Foundation 框架中。 

JSON 和 模型的相互转换

苹果提供了 JSONEncoder 和 JSONDecoder 这两个结构体来方便得在 JSON 数据和自定义模型之间互相转换。苹果可以利用一些系统私有的机制来实现转换,而不需要通过 OC Runtime

只要让自己的数据类型符合 Codable 协议,就可以用系统提供的编解码器进行编解码。

struct User: Codable {var name: Stringvar age: Int
}

解码(JSON Data -> Model):

let user = JSONDecoder().decode(User.self, from: jsonData)

编码(Model -> JSON Data):

let jsonData = JSONEncoder().encode(user)

字典 和 模型的相互转换

将模型用JSONEncoder的encode转成Data,然后再用JSONSerialization反序列化成Dictionary对象。

struct User: Codable {var name: String?var age: Int?static func convertFromDict(dict: NSDictionary) -> User? {var user: User?do {let data = try JSONSerialization.data(withJSONObject: dict, options: [])let decoder = JSONDecoder()user = try decoder.decode(User.self, from: data)} catch {print(error)}return user}func convertToDict() -> NSDictionary? {var dict: NSDictionary?do {let encoder = JSONEncoder()let data = try encoder.encode(self)dict = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSDictionary} catch {print(error)}return dict}
}

http://www.lryc.cn/news/158893.html

相关文章:

  • Vue + Element UI 前端篇(三):工具模块封装
  • 【pytorch】数据加载dataset和dataloader的使用
  • 搭建单机版FastDFS分布式文件存储系统
  • 【验证码逆向专栏】房某下登录滑块逆向分析
  • Python 3.11 版本是对线程安全做了什么更改吗
  • 【Docker】镜像的创建、管理与发布
  • 移动硬盘或U盘无法弹出的解决方法
  • (leetcode1761一个图中连通三元组的最小度数,暴力+剪枝)-------------------Java实现
  • 【漏洞复现】金和OA C6任意文件读取漏洞
  • 2023年全国大学生数学建模B题
  • 【LeetCode】2651.计算列车到站时间
  • Redis——认识Redis
  • 通讯录怎么导入新手机?3个推荐小妙招
  • Geoserver发布shp、tiff、瓦片等格式的GIS数据
  • 读书笔记-《ON JAVA 中文版》-摘要24[第二十一章 数组]
  • go语言基本操作---五
  • 【sgLazyTree】自定义组件:动态懒加载el-tree树节点数据,实现增删改、懒加载及局部数据刷新。
  • Rust个人学习笔记
  • Java根据身份证号码提取出省市区,JSON数据格式
  • MySQL知识笔记——初级基础(实施工程师和DBA工作笔记)
  • javaee 事务的传播行为
  • C#-SQLite-使用教程笔记
  • Tomcat详解 一:tomcat的部署
  • 算法 - 二分
  • 蠕虫病毒问题
  • pytest笔记2: fixture
  • day55 补
  • CSS变量之var()函数的应用——动态修改样式 root的使用
  • 索尼 toio ™应用创意开发征文|一个理想的绘画小助手
  • java加密,使用python解密 ,使用 pysm4 报 byte greater than 16的解决方法