Swift 是苹果公司推出的一种强类型、安全的编程语言,它在 iOS、macOS、watchOS 和 tvOS 应用程序开发中扮演着重要角色。在网络编程中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于各种网络服务中。本文将通过三个部分,详细介绍 Swift 中的 JSON 解析与处理。
第一部分:JSON 基础
1.1 JSON 格式
JSON 是一种基于键值对的数据格式,它使用字符串作为键,并支持多种类型的值,包括数字、字符串、布尔值、数组、对象和 null。JSON 对象是由大括号 {}
包围的键值对集合,而 JSON 数组是由方括号 []
包围的值列表。
{
"name": "张三",
"age": 30,
"isStudent": false,
"courses": ["数学", "英语", "物理"],
"profile": {
"height": 180,
"weight": 70
}
}
1.2 JSON 解析
在 Swift 中,可以使用 JSONSerialization
类将 JSON 数据转换为 Swift 中的数据类型。JSONSerialization
提供了将 JSON 数据转换为 Data
对象,以及将 Data
对象转换为 JSON 数据的功能。
import Foundation
let jsonString = """
{
"name": "张三",
"age": 30
}
"""
if let data = jsonString.data(using: .utf8) {
do {
if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
print(json["name"] as? String) // 输出 "张三"
print(json["age"] as? Int) // 输出 30
}
} catch {
print("JSON 解析失败:\(error)")
}
}
1.3 JSON 序列化
与 JSON 解析相反,JSON 序列化是将 Swift 中的数据类型转换为 JSON 格式的数据。这同样可以通过 JSONSerialization
类实现。
import Foundation
let dictionary: [String: Any] = [
"name": "张三",
"age": 30
]
if let jsonData = try? JSONSerialization.data(withJSONObject: dictionary, options: []) {
if let jsonString = String(data: jsonData, encoding: .utf8) {
print(jsonString)
}
}
第二部分:Swift 中的 JSON 处理
2.1 Codable 协议
Swift 4 引入了 Codable
协议,它简化了 JSON 的解析和序列化过程。通过实现 Codable
协议,Swift 类型和结构体可以自动进行 JSON 解析和序列化。
import Foundation
struct Person: Codable {
var name: String
var age: Int
}
let jsonString = """
{
"name": "张三",
"age": 30
}
"""
if let data = jsonString.data(using: .utf8) {
do {
let person = try JSONDecoder().decode(Person.self, from: data)
print(person.name) // 输出 "张三"
print(person.age) // 输出 30
} catch {
print("JSON 解析失败:\(error)")
}
}
2.2 JSON 处理的高级用法
在实际开发中,JSON 数据的结构往往比较复杂,可能包含嵌套的对象和数组。Codable
协议同样可以很好地处理这些复杂结构。
import Foundation
struct Profile: Codable {
var height: Double
var weight: Double
}
struct Person: Codable {
var name: String
var age: Int
var profile: Profile
}
let jsonString = """
{
"name": "张三",
"age": 30,
"profile": {
"height": 180,
"weight": 70
}
}
"""
if let data = jsonString.data(using: .utf8) {
do {
let person = try JSONDecoder().decode(Person.self, from: data)
print(person.name) // 输出 "张三"
print(person.age) // 输出 30
print(person.profile.height) // 输出 180
print(person.profile.weight) // 输出 70
} catch {
print("JSON 解析失败:\(error)")
}
}