Swift中的JSON处理:实战解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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:

博客

书籍推荐