注意事項:Model 需要實現?HandyJSON
?協議,對于簡單情況,只需聲明?class/struct
?并添加?HandyJSON
?協議即可
1.簡單 JSON 結構
JSON 數據:
{"name": "John","age": 30,"isStudent": false
}
Model 類:
struct Person: HandyJSON {var name: String?var age: Int?var isStudent: Bool?
}
解析調用:
let jsonString = "{\"name\":\"John\",\"age\":30,\"isStudent\":false}"
if let person = Person.deserialize(from: jsonString) {print("Name: \(person.name ?? ""), Age: \(person.age ?? 0), isStudent: \(person.isStudent ?? false)")
}
2.嵌套 JSON 結構
JSON 數據:
{"city": "New York","population": 8500000,"mayor": {"name": "Eric Adams","age": 61}
}
Model 類:
struct Mayor: HandyJSON {var name: String?var age: Int?
}struct City: HandyJSON {var city: String?var population: Int?var mayor: Mayor?
}
解析調用:
if let city = City.deserialize(from: jsonString) {print("City: \(city.city ?? ""), Population: \(city.population ?? 0)")print("Mayor: \(city.mayor?.name ?? ""), Age: \(city.mayor?.age ?? 0)")
}
3.包含數組的 JSON 結構
JSON 數據:
{"school": "Stanford University","departments": [{"name": "Computer Science","students": 1200},{"name": "Mathematics","students": 800}]
}
Model 類:
struct Department: HandyJSON {var name: String?var students: Int?
}struct School: HandyJSON {var school: String?var departments: [Department]?
}
解析調用:
if let school = School.deserialize(from: jsonString) {print("School: \(school.school ?? "")")school.departments?.forEach { dept inprint("Department: \(dept.name ?? ""), Students: \(dept.students ?? 0)")}
}
4.自定義映射和轉換
JSON 數據:
{"user_id": 12345,"created_at": "2023-05-15","is_premium": "yes"
}
Model 類:
struct Account: HandyJSON {var userId: Int?var createdAt: String?var isPremium: Bool?mutating func mapping(mapper: HelpingMapper) {// 指定 JSON 字段名和屬性名的映射mapper <<< self.userId <-- "user_id"mapper <<< self.createdAt <-- "created_at"// 自定義轉換mapper <<< self.isPremium <-- TransformOf<Bool, String>(fromJSON: { value inreturn value == "yes"},toJSON: { value inreturn value == true ? "yes" : "no"})}
}
解析調用:
let jsonString = "{\"user_id\":12345,\"created_at\":\"2023-05-15\",\"is_premium\":\"yes\"}"
if let account = Account.deserialize(from: jsonString) {print("User ID: \(account.userId ?? 0)")print("Created at: \(account.createdAt ?? "")")print("Is premium: \(account.isPremium ?? false)")
}
5.繼承關系的 Model
JSON 數據:
{"type": "student","name": "Alice","grade": "A","courses": ["Math", "Physics"]
}
Model 類:
class Person: HandyJSON {var type: String?var name: String?required init() {}
}class Student: Person {var grade: String?var courses: [String]?required init() {super.init()}override func mapping(mapper: HelpingMapper) {super.mapping(mapper: mapper)}
}
解析調用:
if let student = Student.deserialize(from: jsonString) {print("Name: \(student.name ?? "")")print("Grade: \(student.grade ?? "")")print("Courses: \(student.courses?.joined(separator: ", ") ?? "")")
}
6.高級用法
可選和非可選屬性/HandyJSON 支持可選和非可選屬性:
struct User: HandyJSON {var id: Int // 非可選,JSON中必須存在var name: String? // 可選,JSON中可以不存在
}
默認值
struct Settings: HandyJSON {var theme: String = "light" // 默認值var fontSize: Int = 14
}
枚舉支持
enum UserType: String, HandyJSONEnum {case admin = "admin"case user = "user"case guest = "guest"
}struct UserProfile: HandyJSON {var type: UserType?var username: String?
}
7.總結
HandyJSON 在 Swift 中提供了簡單易用的 JSON 解析功能:
定義 Model 時實現?
HandyJSON
?協議使用?
deserialize(from:)
?方法解析 JSON可以通過?
mapping(mapper:)
?方法自定義映射關系支持嵌套對象、數組、繼承等復雜結構
提供類型轉換和默認值等高級功能