iOS-YModel

YModel 是一个高效的 iOS/OSX 的模型转换框架,可以轻松地将 JSON 转换成 Model,或者将 Model 转换成 JSON。以下是详细的使用指南:

  1. 导入 YYModel: 确保在你的项目中导入了 YYModel。使用 CocoaPods 的话可以在 Podfile 中加入以下代码:
 

1pod 'YYModel'

然后执行 pod install

  1. 创建 Model 类: 对于 JSON 数据,先创建一个对应的 Model 类。比如 JSON 长这样:
 

1{ 2 "uid": 123456, 3 "name": "John", 4 "created": "2016-07-23T08:49:22Z" 5}

创建对应的 Objective-C 类:

 

1#import <YYModel.h> 2 3@interface User : NSObject 4@property (nonatomic, assign) NSUInteger uid; 5@property (nonatomic, copy) NSString *name; 6@property (nonatomic, strong) NSDate *created; 7@end 8 9@implementation User 10@end

  1. JSON 转 Model: 使用 YYModel 的 yy_modelWithJSON: 方法可以快速将 JSON 数据转为 Model 对象。
 

1NSDictionary *jsonDictionary = @{ 2 @"uid": @123456, 3 @"name": @"John", 4 @"created": @"2016-07-23T08:49:22Z" 5}; 6 7User *user = [User yy_modelWithJSON:jsonDictionary];

  1. Model 转 JSON: 将 Model 对象转换回 JSON 字典或者 JSON 字符串非常简单:
 

1// 转换成 JSON 字典 2NSDictionary *jsonDict = [user yy_modelToJSONObject]; 3 4// 转换成 JSON 字符串 5NSString *jsonString = [user yy_modelToJSONString];

  1. 自定义 Model 映射: 如果 JSON 的字段名与 Model 的属性名不一致,或者需要做一些额外的处理,可以通过在 Model 类中实现 + (NSDictionary *)modelCustomPropertyMapper 方法来自定义映射关系:
 

1@implementation User 2 3// 指定 JSON 字段与 Model 属性之间的映射 4+ (NSDictionary *)modelCustomPropertyMapper { 5 return @{ 6 @"uid" : @"id", 7 @"name" : @"n", 8 @"created" : @"time" 9 }; 10} 11 12@end

  1. 处理复杂的嵌套结构: 对于更复杂的嵌套 JSON,例如数组中包含其他 Model 对象,可以通过实现 + (NSDictionary *)modelContainerPropertyGenericClass 方法来指定子 Model 类型:
 

1@interface Blog : NSObject 2@property (nonatomic, copy) NSString *title; 3@property (nonatomic, strong) NSArray<User *> *authors; 4@end 5 6@implementation Blog 7 8// 指定 authors 数组中包含的是 User 类型的对象 9+ (NSDictionary *)modelContainerPropertyGenericClass { 10 return @{ 11 @"authors" : [User class] 12 }; 13} 14 15@end

使用上面的方法,YYModel 可以处理大多数常见的 JSON 转 Model 的需求。另外,YYModel 还支持 Model 编码(NSCoding)和复制(NSCopying)协议,让您的 Model 对象可以进行归档存储和复制操作。

objectC YYModel超级详细使用

GPT4_Turbo_128K

YYModel是一个轻量级的库,用于在Objective-C中将JSON与Model对象进行转换。以下是一些基本和高级用法的详细指导:

基本用法

将JSON(NSDictionary/NSString/NSData)转换为Model
 

1// 假设你有一个User类 2@interface User : NSObject 3@property (nonatomic, assign) UInt64 uid; 4@property (nonatomic, copy) NSString *name; 5@property (nonatomic, strong) NSDate *created; 6@end 7 8// JSON转换为User对象 9NSDictionary *jsonDictionary = @{ 10 @"uid": @123456, 11 @"name": @"John", 12 @"created": @"2016-07-23T08:49:22Z" 13}; 14User *user = [User yy_modelWithJSON:jsonDictionary];

将Model转换为JSON
 

1// User对象转JSON对象 2NSDictionary *json = [user yy_modelToJSONObject];

自定义映射

如果Model的属性名和JSON的key不一样,可以在Model中重写+modelCustomPropertyMapper方法。

 

1@interface User : NSObject 2@property (nonatomic, assign) UInt64 userId; 3@property (nonatomic, copy) NSString *userName; 4@property (nonatomic, strong) NSDate *createdAt; 5@end 6 7@implementation User 8// 自定义映射 9+ (NSDictionary *)modelCustomPropertyMapper { 10 return @{@"userId" : @"uid", 11 @"userName" : @"name", 12 @"createdAt" : @"created"}; 13} 14@end

处理复杂结构

对于JSON中包含数组和嵌套的Model,需要指定数组中对象的类型。

 

1@interface Book : NSObject 2@property (nonatomic, copy) NSString *title; 3@property (nonatomic, strong) NSArray<User *> *authors; 4@end 5 6@implementation Book 7// 告诉YYModel数组authors中存放的对象是User类型 8+ (NSDictionary *)modelContainerPropertyGenericClass { 9 return @{@"authors" : [User class]}; 10} 11@end

自定义转换

如果转换过程中需要一些特殊的处理,可以重写-modelCustomTransformFromDictionary:-modelCustomTransformToDictionary:方法。

 

1@implementation User 2// 从JSON转换到Model之前的自定义处理 3- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic { 4 if (![dic[@"created"] isKindOfClass:[NSString class]]) return NO; 5 6 // 对created字段进行自定义转换,比如日期格式转换 7 NSString *createdStr = dic[@"created"]; 8 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 9 formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ"; 10 _created = [formatter dateFromString:createdStr]; 11 12 return YES; 13} 14 15// 从Model转换到JSON之前的自定义处理 16- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic { 17 // 对NSDate类型的created属性转换成字符串 18 if (!_created) return NO; 19 20 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 21 formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ"; 22 dic[@"created"] = [formatter stringFromDate:_created]; 23 24 return YES; 25} 26@end

编码和解码

YYModel也支持NSCoding协议,可以很容易地对Model对象进行归档和解档。

 

1// User遵循NSCoding协议 2@interface User : NSObject <NSCoding> 3//...属性声明 4@end 5 6// 归档 7[NSKeyedArchiver archiveRootObject:user toFile:path]; 8 9// 解档 10User *unarchivedUser = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

如果Model有遵守NSCoding,YYModel会自动使用这些协议方法进行编码和解码。

复制

YYModel还支持NSCopying协议,可以实现对象的复制。

 

1// User遵循NSCopying协议 2@interface User : NSObject <NSCopying> 3//...属性声明 4@end 5 6// 实现复制方法 7- (id)copyWithZone:(NSZone *)zone { 8 return [self yy_modelCopy]; 9} 10 11// 使用 12User *userCopy = [user copy];

注意事项

  • JSON的key是大小写敏感的,所以需要确保映射是正确的。
  • 在处理时间戳或其他数据格式转换时,碰到非法格式应该返回NO,避免数据错误。
  • 使用yy_modelWithJSON:或者yy_modelToJSONObject时,确保传递的对象是有效的JSON对象。
  • YYModel的性能非常好,在大多数情况下,甚至优于手动编写的Model转换代码。

这些就是YYModel的超级详细使用指南,通过以上方法,你应该可以应对大部分Model与JSON转换的情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67701.shtml

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

相关文章

PhyCAGE:符合物理规律的图像到 3D 生成

Paper: Yan H, Zhang M, Li Y, et al. PhyCAGE: Physically Plausible Compositional 3D Asset Generation from a Single Image[J]. arXiv preprint arXiv:2411.18548, 2024. Introduction: https://wolfball.github.io/phycage/ Code: Unreleased PhyCAGE 是一种 image-to-3D…

麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 之前咱们学习了LNMP架构&#xff0c;但是PHP对于技术来说确实是老掉牙了&#xff0c;PHP的市场占有量越来越少了&#xff0c;我认识一个10年的PHP开发工程师&#xff0c;十年工资从15k到今天的6k&am…

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS&#xff0c;还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS&#xff1f; 与非安全HTTP于不同&#xff0c;安全域使用SSL&#xff08;安全套接字层&#xff09;服务器上的加密代…

大模型GUI系列论文阅读 DAY1:《基于大型语言模型的图形用户界面智能体:综述》(6.6W 字长文)

摘要 图形用户界面&#xff08;Graphical User Interfaces, GUIs&#xff09;长期以来一直是人机交互的核心&#xff0c;为用户提供了直观且以视觉为驱动的方式来访问和操作数字系统。传统上&#xff0c;GUI交互的自动化依赖于基于脚本或规则的方法&#xff0c;这些方法在固定…

实战经验:使用 Python 的 PyPDF 进行 PDF 操作

文章目录 1. 为什么选择 PyPDF&#xff1f;2. 安装 PyPDF3. PDF 文件的合并与拆分3.1 合并 PDF 文件3.2 拆分 PDF 文件 4. 提取 PDF 文本5. 修改 PDF 元信息6. PDF 加密与解密6.1 加密 PDF6.2 解密 PDF 7. 页面旋转与裁剪7.1 旋转页面7.2 裁剪页面 8. 实战经验总结 PDF 是一种非…

MySQL 安装配置(完整教程)

文章目录 一、MySQL 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL5.1 初始化 MySQL5.2 启动 MySQL 服务 六、修改 MySQL 密码七、卸载 MySQL八、结语 一、MySQL 简介 MySQL 是一款广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#…

PostgreSQL的学习心得和知识总结(一百六十六)|深入理解PostgreSQL数据库之\watch元命令的实现原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

当当网书籍信息爬虫

1.基本理论 1.1概念体系 网络爬虫又称网络蜘蛛、网络蚂蚁、网络机器人等&#xff0c;可以按照我们设置的规则自动化爬取网络上的信息&#xff0c;这些规则被称为爬虫算法。是一种自动化程序&#xff0c;用于从互联网上抓取数据。爬虫通过模拟浏览器的行为&#xff0c;访问网页…

计算机网络 (50)两类密码体制

前言 计算机网络中的两类密码体制主要包括对称密钥密码体制&#xff08;也称为私钥密码体制、对称密码体制&#xff09;和公钥密码体制&#xff08;也称为非对称密码体制、公开密钥加密技术&#xff09;。 一、对称密钥密码体制 定义&#xff1a; 对称密钥密码体制是一种传…

【PowerQuery专栏】实现JSON数据的导入

Json 格式数据是在互联网数据格式传输使用的非常频繁的一类数据,图7.44为Json数据格式中比较典型的数据格式。 PowerQuery进行Json数据解析使用的是Json.Document进行数据解析,Json.Document目前有2个参数。 参数1为内容数据,数据类型为二进制类型,值为需要解析的Json数据参…

软件授权管理中的软件激活向导示例

软件激活向导示例 在软件许可中&#xff0c;提供许可应该是简单和安全的。这适用于想要在中央许可证服务器上创建新许可证的软件开发人员&#xff0c;也适用于需要在其设备上获得许可证的最终用户。如果所讨论的系统有互联网连接&#xff0c;或是暂时的连接&#xff0c;就可以…

模型部署工具01:Docker || 用Docker打包模型 Build Once Run Anywhere

Docker 是一个开源的容器化平台&#xff0c;可以让开发者和运维人员轻松构建、发布和运行应用程序。Docker 的核心概念是通过容器技术隔离应用及其依赖项&#xff0c;使得软件在不同的环境中运行时具有一致性。无论是开发环境、测试环境&#xff0c;还是生产环境&#xff0c;Do…

【云岚到家】-day03-门户缓存方案选择

【云岚到家】-day03-门户缓存方案选择 1.门户常用的技术方案 什么是门户 说到门户马上会想到门户网站&#xff0c;中国比较早的门户网站有新浪、网易、搜狐、腾讯等&#xff0c;门户网站为用户提供一个集中的、易于访问的平台&#xff0c;使他们能够方便地获取各种信息和服务…

网络安全VS数据安全

关于网络安全和数据安全&#xff0c;我们常听到如下两种不同声音&#xff1a; 观点一&#xff1a;网络安全是数据安全的基础&#xff0c;把当年做网络安全的那一套用数据安全再做一遍。 观点二&#xff1a;数据安全如今普遍以为是网络安全的延伸&#xff0c;实际情况是忽略数据…

Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )

一、文件处理 1.1、文件操作的重要性和应用场景 1.1.1、重要性 数据持久化&#xff1a; 文件是存储数据的一种非常基本且重要的方式。通过文件&#xff0c;我们可 以将程序运行时产生的数据永久保存下来&#xff0c;以便将来使用。 跨平台兼容性&#xff1a; 文件是一种通用…

Ubuntu 24.04 LTS 安装 Docker Desktop

Docker 简介 Docker 简介和安装Ubuntu上学习使用Docker的详细入门教程Docker 快速入门Ubuntu版&#xff08;1h速通&#xff09; Docker 安装 参考 How to Install Docker on Ubuntu 24.04: Step-by-Step Guide。 更新系统和安装依赖 在终端中运行以下命令以确保系统更新并…

python+pygame+pytmx+map editor开发一个tiled游戏demo 05使用object层初始化player位置

代码 import mathimport pygame# 限制物体在屏幕内 import pytmxdef limit_position_to_screen(x, y, width, height):"""限制物体在屏幕内"""x max(0, min(x, SCREEN_WIDTH - width)) # 限制x坐标y max(0, min(y, SCREEN_HEIGHT - height))…

函数递归的介绍

1.递归的定义 在C语言中&#xff0c;递归就是函数自己调用自己 上面的代码就是 main 函数在函数主体内 自己调用自己 但是&#xff0c;上面的代码存在问题&#xff1a;main 函数反复地 自己调用自己 &#xff0c;不受限制&#xff0c;停不下来。 最终形成死递归&#xff0c;…

【PCIe 总线及设备入门学习专栏 6.1 -- PCIe MCTP】

文章目录 1 什么是 MCTP?2 MCTP 消息在 PCIe 中的传输特点3 PCIe MCTP 的局限性(1) 出站(Outbound)MCTP 消息分解的限制(2) 入站(Inbound)MCTP 消息组装的限制4 MCTP 消息的实际使用流程发送端处理流程接收端处理流程5 实际使用场景例 1:管理命令传输例 2:监控数据报告例…

Text2Sql:开启自然语言与数据库交互新时代(30/30)

一、Text2Sql 简介 在当今数字化时代&#xff0c;数据处理和分析的需求日益增长。对于众多非技术专业人员而言&#xff0c;数据库操作的复杂性常常成为他们获取所需信息的障碍。而 Text2Sql 技术的出现&#xff0c;为这一问题提供了有效的解决方案。 Text2Sql&#xff0c;即文…