简介
在 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!)