iOS-YModel

news/2025/1/22 6:09:48/

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.ppmy.cn/news/1565152.html

相关文章

Java 在包管理与模块化中的优势:与其他开发语言的比较

在开发复杂的、规模庞大的软件系统时&#xff0c;包管理和模块化设计起着至关重要的作用。它们不仅决定了代码的组织和可维护性&#xff0c;还直接影响到团队协作效率、扩展性和性能。在众多编程语言中&#xff0c;Java 凭借其成熟的生态系统、强类型系统和标准化的包管理机制&…

JupyterLab 安装以及部分相关配置

安装 JupyterLab pip install jupyter启动 JupyterLab jupyter lab [--port <指定的端口号>] [--no-browser] # --port 指定端口 # --no-browser 启动时不打开浏览器安装中文 首先安装中文包 pip install jupyterlab-language-pack-zh-CN安装完成后重启 JupyterLab 选…

【STM32-学习笔记-15-】MAX7219点阵屏模块

文章目录 MAX7219点阵模块一、MAX7219Ⅰ、 概述Ⅱ、功能特点Ⅲ、引脚功能Ⅳ、典型应用电路Ⅴ、内部组成结构Ⅵ、时序图Ⅶ、寄存器 二、STM32控制点阵屏Ⅰ、程序框图Ⅱ、程序编写①、MAX7219.c②、MAX7219.h③、MAX7219_Img.h④、main.c MAX7219点阵模块 一、MAX7219 Ⅰ、 概述…

性能调优篇 四、JVM运行时参数

目录 一、三种JVM参数选项1、标准参数选项1&#xff09;特点2&#xff09;各种选项3&#xff09;-server 和 -client 2、-X参数选项3、-XX参数选项 二、添加JVM参数选项1、idea 如何添加jvm参数 三、常见的JVM参数选项1、打印设置的参数选项及其值2、堆、栈、方法区等内存大小设…

1. 基于图像的三维重建

1. 基于图像的三维重建 核心概念三维重建中深度图、点云的区别&#xff1f;深度图点云总结 深度图到点云还需要什么步骤&#xff1f;1. **获取相机内参**2. **生成相应的像素坐标**3. **计算三维坐标**4. **构建点云**5. **处理颜色信息&#xff08;可选&#xff09;**6. **去除…

【Unity3D】3D物体摆放、场景优化案例Demo

目录 PlaceManager.cs(放置管理类) Ground.cs(地板类) 和 GroundData.cs(地板数据类) 额外知识点说明 1、MeshFilter和MeshRenderer的Bounds区别 2、Gizmos 绘制一个平行于斜面的立方体 通过网盘分享的文件&#xff1a;PlaceGameDemo2.unitypackage 链接: https://pan.baid…

Go-Gin Web 框架完整教程

1. 环境准备 1.1 Go 环境安装 Go 语言&#xff08;或称 Golang&#xff09;是一个开源的编程语言&#xff0c;由 Google 开发。在开始使用 Gin 框架之前&#xff0c;我们需要先安装 Go 环境。 安装步骤&#xff1a; 访问 Go 官网下载页面&#xff1a;https://golang.org/dl…

Redis可视化工具--RedisDesktopManager的安装

需要安装使用&#xff0c;0.9.4以上是要收费的 下载地址&#xff1a;https://github.com/uglide/RedisDesktopManager/releases/download/0.9.3/redis-desktop-manager-0.9.3.817.exe 详情&#xff1a;https://blog.csdn.net/u012688704/article/details/82251338 点击进行安…