Swift中的JSON处理:实战解析与序列化
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,已成为移动和Web开发中客户端与服务器交互的事实标准。在Apple生态系统(iOS、macOS、watchOS、tvOS)中,通过强大的内置机制来处理JSON。本文将结合实际示例,详细讲解如何使用现代协议Codable和经典方法JSONSerialization在Swift中解析和序列化JSON。
本文面向已经熟悉Swift基础,并希望自信地处理网络请求和本地JSON格式数据存储的开发者。
1. JSON基础及其在Swift应用中的位置
JSON是一种基于两种结构的文本格式:对象(键值对集合)和数组(有序列表)。在Swift中,这些结构对应Dictionary和Array。JSON中的数据类型有限:字符串、数字、布尔值、null、对象和数组。
在iOS/macOS应用中使用JSON的典型场景如下:
- 从服务器获取JSON字符串(通过URLSession)。
- 将JSON解析为Swift模型(例如结构体或类)。
- 处理数据并在界面中显示。
- 将模型序列化(反向转换)为JSON以发送到服务器。
Apple提供了两种主要的JSON处理方法:JSONSerialization(底层但灵活)和Codable(高层、类型安全,自Swift 4+起推荐使用)。
2. 使用Codable解析JSON(推荐方式)
Codable协议结合了Encodable(用于序列化)和Decodable(用于解析)。这是在Swift中处理JSON最简单、最安全的方式。
示例1:解析简单的JSON对象
假设服务器返回以下JSON:
{ "userId": 1, "id": 1, "title": "示例任务", "completed": false}创建一个符合Codable的模型结构体:
struct TodoItem: Codable { let userId: Int let id: Int let title: String let completed: Bool}现在执行JSON字符串的解析:
let jsonString = """{ "userId": 1, "id": 1, "title": "示例任务", "completed": false}"""
if let jsonData = jsonString.data(using: .utf8) { let decoder = JSONDecoder() do { let todo = try decoder.decode(TodoItem.self, from: jsonData) print("任务:\\(todo.title),已完成:\\(todo.completed)") } catch { print("解析错误:\\(error.localizedDescription)") }}示例2:解析对象数组
如果服务器返回一个任务数组:
[ {"userId": 1, "id": 1, "title": "任务1", "completed": false}, {"userId": 1, "id": 2, "title": "任务2", "completed": true}]解析同样简单——只需指定数组类型:
let todoArray = try decoder.decode([TodoItem].self, from: jsonData)2.1. 自定义键和snake_case
JSON经常使用snake_case格式(例如user_id),而Swift中采用camelCase(userId)。JSONDecoder可以自动转换键:
decoder.keyDecodingStrategy = .convertFromSnakeCase如果需要设置非标准映射,请使用CodingKeys枚举:
struct User: Codable { let fullName: String let emailAddress: String
enum CodingKeys: