iOS 之数据的序列化和反序列化

330 阅读2分钟

简介

在 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 协议,就可以同时实现DecodableEncodable的功能,从而使数据模型能够进行JSON 数据序列化反序列化

Codable 协议实际上是DecodableEncodable两个协议的组合,所以只要一个类型遵循了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)

属性列表数据

PropertyListEncoderPropertyListDecoder用于处理属性列表(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!)