当前位置: 首页 > 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.dtcms.com/a/274479.html

相关文章:

  • VS Code 插件扩展开发指南
  • AI的欧几里得要素时刻:从语言模型到可计算思维
  • 玖玖NFT数字藏品源码(源码下载)
  • 【达梦数据库|JPA】后端数据库国产化迁移记录
  • 解读:大模型(LLM)、检索增强生成(RAG)、智能体(Agent)
  • 城市之间消防主机长距离使用can转以太网通讯方案
  • JDBC 批处理操作详解
  • leetcode105深度解析:从前序与中序遍历序列构造二叉树
  • 我找工作的时候,AI到底帮了我还是坑了我?
  • 益丰新材闯上市:营收连降,核心原料依赖关联方,马韵升家族控股
  • 【每日刷题】x 的平方根
  • [TOOL] ubuntu 使用 ffmpeg 操作 gif、mp4
  • UNet改进(21):门控注意力机制在UNet中的应用与优化
  • mongodb 开源同步工具介绍
  • c++11——左值、右值、完美转发、移动语义
  • 【AI News | 20250710】每日AI进展
  • 60 美元玩转 Li-Fi —— 开源 OpenVLC 平台入门(附 BeagleBone Black 驱动简单解析)
  • UE5中的cesium
  • flex 布局完整功能介绍和示例演示
  • windows配置python环境
  • 获取Fortran程序内存使用情况的方法
  • 多租户架构下的多线程处理实践指南
  • 上位机知识篇---Git符号链接
  • mysql 数据备份与数据恢复
  • BigFoot Decursive 2.7.28 2025.07.11
  • 伺服驱动控制CANopen协议
  • [WinForms] 如何为 .NET Framework 4.8 窗体程序添加自定义图标
  • 力扣面试150(29/100)
  • vue3 el-input 通过数组 获取显示
  • 上位机知识篇---网络通信端口