当前位置: 首页 > news >正文

HandyJSON使用详情

注意事项: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 解析功能:

  1. 定义 Model 时实现 HandyJSON 协议

  2. 使用 deserialize(from:) 方法解析 JSON

  3. 可以通过 mapping(mapper:) 方法自定义映射关系

  4. 支持嵌套对象、数组、继承等复杂结构

  5. 提供类型转换和默认值等高级功能

http://www.lryc.cn/news/585361.html

相关文章:

  • 使用Spring Boot和PageHelper实现数据分页
  • Excel快捷键
  • 20250710-2-Kubernetes 集群部署、配置和验证-网络组件存在的意义?_笔记
  • leetcode:377. 组合总和 Ⅳ[完全背包]
  • 代账行业数字化破局:从“知道”到“做到”,三步走稳赢!
  • RK3566/RK3568 Android11 修改selinux模式
  • 森马服饰从 Elasticsearch 到阿里云 SelectDB 的架构演进之路
  • 【牛客刷题】超级圣诞树(递归法和分形复制法)
  • TCP服务器与客户端三种方法实现
  • Java使用OSHI获取服务器信息
  • 网络安全基础作业
  • python学习DataFrame数据结构
  • 无锁队列:从零构建生产者-消费者数据结构
  • 第十七节:第三部分:网络通信:UDP通信,一发一收,多发多收
  • 汽车级MCU选型新方向:eVTOL垂桨控制监控芯片的替代选型技术分析
  • aaa认证
  • lora网关
  • 如何选择数据可视化工具?从设计效率到图表表现力全解读
  • OD(OllyDbg)使用介绍
  • day02-数组part02
  • 网络安全初级小练
  • 【前端】【组件库开发】【原理】【无框架开发】现代网页弹窗开发指南:从基础到优化
  • Oracle字符类型详解:VARCHAR、VARCHAR2与CHAR的区别
  • 业务建模如何让金融数字化转型 “轻” 装上
  • 林吉特危机下的技术革命:马来西亚金融系统升维作战手册
  • axios 与 fetch 的区别
  • wpf Canvas 导出图片
  • 飞算JavaAI:重构Java开发的“人机协同”新范式
  • 使用浏览器inspect调试wx小程序
  • 功能测试知识总结