注意事项: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:)
方法自定义映射关系支持嵌套对象、数组、继承等复杂结构
提供类型转换和默认值等高级功能