注意事项: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.pswp.cn/diannao/91081.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91081.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/91081.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

comfyUI-IPApterfaceID人脸特征提取

1.基础节点 以Checkpoint、CLIP、空Latent、K采样器、VAE解码、预览图像为基础节点。 2.人脸特征获取节点 IPAdapter FaceID节点专用于将特定人脸特征&#xff08;通过参考图提取&#xff09;融入生成图像。 参考图像&#xff0c;正面图像是想要参考人物的人像&#xff0c;最…

【React Native】Switch、Alert、Dimensions、StatusBar、Image组件

其他常用组件 swich https://reactnative.dev/docs/next/switch alert Alert React Native 如果想增加里面的按钮&#xff0c;就往这个数组里&#xff0c;按照这个格式不断的加东西就行了。但是&#xff1a; 在iOS上&#xff0c;里面多少个都有问题&#xff0c;3 个以上它…

渗透笔记1-4

一、HTTPS安全机制 1. HTTP的安全风险 窃听风险&#xff1a;明文传输导致通信内容可被直接截获&#xff08;如Wireshark抓包获取密码&#xff09;。篡改风险&#xff1a;中间人可修改传输内容&#xff08;如注入恶意脚本&#xff09;。冒充风险&#xff1a;攻击者伪造服务端身份…

《星盘接口6:星际联盟》

《星盘接口6&#xff1a;星际联盟》⚡ 第一章&#xff1a;新的黎明地球历2097年&#xff0c;陈欣和她的团队成功地将“数据之神”封印在一个独立的数据维度中&#xff0c;暂时解除了对银河系的威胁。然而&#xff0c;这场胜利并没有带来长久的和平。随着人类文明不断扩展至更遥…

【安卓笔记】进程和线程的基础知识

0. 环境&#xff1a; 电脑&#xff1a;Windows10 Android Studio: 2024.3.2 编程语言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 先熟悉JVM虚拟机的线程 ----------以下都是系统线程&#xff0c;由JV…

26-计组-多处理器

多处理器的基本概念1. 计算机体系结构分类依据&#xff1a;根据指令流和数据流的数量关系&#xff0c;计算机体系结构可分为四种类型&#xff1a;SISD、SIMD、MISD、MIMD。&#xff08;1&#xff09;SISD 单指令流单数据流定义&#xff1a;任意时刻计算机只能执行单一指令操作单…

vscode 插件开发activityba

在 VS Code 插件开发中&#xff0c;**Activity Bar&#xff08;活动栏&#xff09;**是左侧垂直导航栏的核心组成部分&#xff0c;它为用户提供了快速访问插件功能的入口。通过自定义 Activity Bar&#xff0c;开发者可以显著提升插件的可见性和用户体验。以下是关于 Activity …

【橘子分布式】Thrift RPC(理论篇)

一、简介 首先还是那句话&#xff0c;概念网上已经很多了&#xff0c;我们就不多逼逼了。我来大致介绍一下。 Thrift是一个RPC框架可以进行异构系统(服务的提供者 和 服务的调用者 不同编程语言开发系统)的RPC调用为什么在当前的系统开发中&#xff0c;会存在着异构系统的RPC…

项目进度依赖纸面计划,如何提升计划动态调整能力

项目进度依赖纸面计划会导致实际执行中的调整能力不足。提升计划动态调整能力的方法包括&#xff1a;建立动态进度管理系统、强化团队沟通与协作、定期开展风险评估与进度复盘。特别是建立动态进度管理系统&#xff0c;通过信息技术工具实现实时跟踪和反馈&#xff0c;使计划能…

递推预处理floor(log_2{n})

在C中&#xff0c;除了使用<cmath>中的log或log2函数求对数&#xff0c;也可以通过递推求出所有可能用到的⌊log⁡2i⌋,i∈[1,n]\lfloor \log_2i\rfloor, i\in[1, n]⌊log2​i⌋,i∈[1,n] 证明&#xff1a;⌊log⁡2i⌋⌊log⁡2⌊i2⌋⌋1\lfloor \log_2i \rfloor\lfloor \…

【AI智能体】智能音视频-搭建可视化智能体

可视化智能体是语音小伴侣智能体的升级版&#xff0c;支持语音与视频的双模态交互。本文详细介绍了音视频交互的实现原理、智能体搭建方法及效果测试&#xff0c;帮助开发者快速构建支持音视频交互的智能体。 应用场景 可视化智能体适用于多种场景&#xff0c;举例如下&#…

Sensoglove推出新一代外骨骼力反馈手套:主动力反馈+亚毫米级手指追踪,助力机器人操控与虚拟仿真

在工业自动化、虚拟现实和医疗康复等领域&#xff0c;高精度手部交互设备的需求日益增长。Sensoglove推出的Rembrandt外骨骼力反馈手套&#xff0c;结合主动力反馈、触觉反馈与亚毫米级追踪技术&#xff0c;为用户提供更自然、更安全的操作体验。Sensoglove外骨骼力反馈手套核心…

AutoMapper入门

在 ASP.NET Core 开发中&#xff0c;我们经常需要在不同层之间传递数据&#xff1a;比如从数据库模型&#xff08;Entity&#xff09;转换到 DTO&#xff0c;再从 DTO 转换为前端视图模型。这些转换代码大量重复、冗长、容易出错。为了解决这个问题&#xff0c;AutoMapper 诞生…

PyTorch武侠演义 第一卷:初入江湖 第1章:武林新秀遇Tensor - 张量基础

第一卷&#xff1a;初入江湖 第1章&#xff1a;武林新秀遇Tensor - 张量基础晨起码农村 鸡鸣三声&#xff0c;林小码已经收拾好了行囊。他最后看了眼床头那本翻旧的《Python入门心法》&#xff0c;轻轻抚平卷起的书角。 "小码&#xff0c;路上小心。"父亲将一把青铜匕…

Python进阶(4):类与面向对象程序设计

面向对象OOPOOP:Object Oriented Programming,面向对象编程,面向对象中的对象(Obiect)&#xff0c;通常是指客观世界中存在的对象&#xff0c;这个对象具有唯一性&#xff0c;对象之间各不相同&#xff0c;各有各的特点&#xff0c;每个对象都有自己的运动规律和内部状态;对象与…

如何在 Shopify 中创建退货标签

退货是电商运营中不可避免的一环&#xff0c;而一个顺畅、透明的退货流程&#xff0c;不仅能减少客户投诉&#xff0c;也有助于提升顾客对品牌的信任与忠诚度。Shopify 虽然没有内建退货标签自动生成功能&#xff0c;但通过合理设置与外部工具整合&#xff0c;你完全可以打造一…

I2C设备寄存器读取调试方法

1、查看I2C挂载设备 2、读取i2C设备所有寄存器 3、读取i2c设备的某个寄存器 4、向i2C设备某个寄存器写入一个值1、查看

K8S的Helm包管理器

一、背景 官网: https://helm.sh/ 我们针对K8S环境中&#xff0c;部署对应的应用&#xff0c;无外乎就是编写一堆yaml资源清单文件. 资源清单、依赖性少的时候&#xff0c;可以直接手动维护。但是&#xff0c;随着资源清单越来越复杂&#xff0c;越来越多&#xff0c;不同的环…

多模态数据处理新趋势:阿里云ODPS技术栈深度解析与未来展望

多模态数据处理新趋势&#xff1a;阿里云ODPS技术栈深度解析与未来展望 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈…

AI数据分析仪设计原理图:RapidIO信号接入 平板AI数据分析仪

AI数据分析仪设计原理图&#xff1a;RapidIO信号接入 平板AI数据分析仪 1 、概述 本仪器是一款面向工业控制、新能源、震动测量等业务开发的平板AI数据分析仪。基于 Jetson Orin Nano&#xff08;AI边缘计算&#xff09;、实现RapidIO接口数据接入&#xff0c;进行AI分析。Rap…