简介
在 iOS 开发中,数据序列化和反序列化也是十分重要的,下面将会从 JSON 数据和 Property List(属性列表)数据的序列化和反序列化进入本文主题,其中 JSON 数据的序列化和反序列化是本文的重点
JSON 数据
在网络请求获取到JSON 对象数据
后还需要将其反序列化
为模型对象数据
以供页面内容渲染;而在发起POST
等需要携带请求体的请求时,又需要将模型对象数据
通过序列化
转为JSON 对象数据
,本部分将会针对此展开说明
反序列化
JSONDecoder
用于将JSON 数据
解析成Swift 对象
。需创建一个符合Decodable
协议的结构体或类的数据模型,以便JSONDecoder
可以将JSON 数据
映射到该模型
// 遵循 Decodable 协议
struct Model: Decodable {
let name: String
let age: Int
let isStudent: Bool
}
let model = JSONDecoder.decode(Model.self, from: jsonData)
序列化
JSONEncoder
用于将Swift 对象
编码为JSON 数据
。需要创建一个符合Encodable
协议的结构体或类的数据模型,以便JSONEncoder
可以将数据模型
转换为JSON 数据
// 遵循 Encodable 协议
struct Model: Encodable {
let name: String
let age: Int
let isStudent: Bool
}
model = Model(name: "John Doe", age: 30, isStudent: false)
let jsonData = try JSONEncoder().encode(model)
Codable 协议
在Swift
中,只需要让数据模型(结构体或类)
遵循Codable 协议
,就可以同时实现Decodable
和Encodable
的功能,从而使数据模型
能够进行JSON 数据
的序列化
和反序列化
Codable 协议
实际上是Decodable
和Encodable
两个协议的组合,所以只要一个类型遵循了Codable
协议,它就具备了将其实例编码为JSON 数据
和将JSON 数据
解码为实例的能力
// 遵循 Codable 协议
struct Model: Codable {
let name: String
let age: Int
let isStudent: Bool
}
let model = JSONDecoder.decode(Model.self, from: jsonData)
model = Model(name: "John Doe", age: 30, isStudent: false)
let jsonData = try JSONEncoder().encode(model)
属性列表数据
PropertyListEncoder
和PropertyListDecoder
用于处理属性列表(Property List)格式
数据,这是一种特定于Apple平台的数据格式,通常用于保存配置文件、用户偏好设置
import Foundation
struct Model: Codable {
let name: String
let age: Int
}
let model = Model(name: "John Doe", age: 30)
// 使用 PropertyListEncoder 和 PropertyListDecoder 处理属性列表数据
let plistData = try? PropertyListEncoder().encode(model)
let decodedPersonFromPlist = try? PropertyListDecoder().decode(Model.self, from: plistData!)