Swift中SwiftyJSON使用详情
1.简单的JSON数据结构
原始 JSON:
//json数据
{"name": "John Doe","age": 30,"isStudent": false
}
对应的 Model 类:
struct Person {let name: Stringlet age: Intlet isStudent: Bool// 使用 SwiftyJSON 初始化init(json: JSON) {name = json["name"].stringValueage = json["age"].intValueisStudent = json["isStudent"].boolValue}
}
调用方式:
let json = JSON(parseJSON: jsonString)
let person = Person(json: json)
print("Name: \(person.name), Age: \(person.age)")
2.嵌套对象 JSON
原始 JSON:
{"person": {"name": "Jane Smith","address": {"street": "123 Main St","city": "New York"}}
}
对应的 Model 类:
//先从最内层开始解析
struct Address {let street: Stringlet city: Stringinit(json: JSON) {street = json["street"].stringValuecity = json["city"].stringValue}
}struct PersonInfo {let name: Stringlet address: Addressinit(json: JSON) {name = json["name"].stringValueaddress = Address(json: json["address"])}
}struct RootObject {let person: PersonInfoinit(json: JSON) {person = PersonInfo(json: json["person"])}
}
调用方式:
let json = JSON(parseJSON: jsonString)
let root = RootObject(json: json)
print("\(root.person.name) lives at \(root.person.address.street)")
3. 数组 JSON 结构
原始 JSON:
{"fruits": ["apple", "banana", "orange"]
}
对应的 Model 类:
struct Fruits {let fruits: [String]init(json: JSON) {fruits = json["fruits"].arrayValue.map { $0.stringValue }}
}
调用方式:
let json = JSON(parseJSON: jsonString)
let fruits = Fruits(json: json)
print("Available fruits: \(fruits.fruits.joined(separator: ", "))")
4.复杂嵌套结构
原始 JSON:
{"company": "Tech Inc.","departments": [{"name": "Engineering","employees": [{"id": 101,"name": "Mike","skills": ["Swift", "Python", "JavaScript"]}]}]
}
对应的 Model 类:
struct Employee {let id: Intlet name: Stringlet skills: [String]init(json: JSON) {id = json["id"].intValuename = json["name"].stringValueskills = json["skills"].arrayValue.map { $0.stringValue }}
}struct Department {let name: Stringlet employees: [Employee]init(json: JSON) {name = json["name"].stringValueemployees = json["employees"].arrayValue.map { Employee(json: $0) }}
}struct Company {let name: Stringlet departments: [Department]init(json: JSON) {name = json["company"].stringValuedepartments = json["departments"].arrayValue.map { Department(json: $0) }}
}
调用方式:
let json = JSON(parseJSON: jsonString)
let company = Company(json: json)print("Company: \(company.name)")
for department in company.departments {print("\nDepartment: \(department.name)")for employee in department.employees {print(" - \(employee.name) (ID: \(employee.id))")print(" Skills: \(employee.skills.joined(separator: ", "))")}
}
5.使用 Codable 协议 (推荐方式)
原始 JSON:
//json数据
{"name": "John Doe","age": 30,"isStudent": false
}
对应的 Model 类:
struct Person: Codable {let name: Stringlet age: Intlet isStudent: Bool
}// 解析方法
extension Person {static func from(json: JSON) -> Person? {do {let data = try json.rawData()return try JSONDecoder().decode(Person.self, from: data)} catch {print("Decoding error: \(error)")return nil}}
}
调用方式:
let json = JSON(parseJSON: jsonString)
if let person = Person.from(json: json) {print("Person: \(person.name)")
}
6.复杂结构的 Codable 实现
原始JSON:
{"company": "Tech Inc.","departments": [{"name": "Engineering","employees": [{"id": 101,"name": "Mike","skills": ["Swift", "Python", "JavaScript"]}]}]
}
对应的 Model 类:
struct Company: Codable {let name: Stringlet departments: [Department]enum CodingKeys: String, CodingKey {case name = "company"case departments}
}struct Department: Codable {let name: Stringlet employees: [Employee]
}struct Employee: Codable {let id: Intlet name: Stringlet skills: [String]
}// 解析扩展
extension Company {static func from(json: JSON) -> Company? {do {let data = try json.rawData()return try JSONDecoder().decode(Company.self, from: data)} catch {print("Decoding error: \(error)")return nil}}
}
7.完成的例子
原始JSON:
// 使用示例
let jsonString = """
{"id": 1,"name": "John Doe","address": {"street": "123 Main St","city": "New York","zip_code": "10001"},"tags": ["swift", "ios", "developer"]
}
"""
对应的 Model 类:
import SwiftyJSONstruct User: Codable {let id: Intlet name: Stringlet email: String?let address: Addresslet tags: [String]struct Address: Codable {let street: Stringlet city: Stringlet zipCode: String?enum CodingKeys: String, CodingKey {case street, citycase zipCode = "zip_code"}}
}extension User {static func from(json: JSON) -> User? {do {let data = try json.rawData()let decoder = JSONDecoder()decoder.keyDecodingStrategy = .convertFromSnakeCase // 处理蛇形命名return try decoder.decode(User.self, from: data)} catch {print("Decoding error: \(error)")return nil}}
}
调用方式:
let json = JSON(parseJSON: jsonString)
if let user = User.from(json: json) {print("User: \(user.name)")print("Address: \(user.address.street), \(user.address.city)")print("Tags: \(user.tags.joined(separator: ", "))")
}