尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

yymodel 某个属性当iOS以int接受 而接口返回null,json解析会崩溃不

yymodel 某个属性当iOS以int接受 而接口返回null,json解析会崩溃不
📅 发布时间:2026/6/20 15:06:14
使用 YYModel 时,如果接口返回 null而 iOS 端用 int类型接收,​​不会崩溃,但会有默认值​​。

YYModel 的处理机制

1. 基本数据类型(int/NSInteger等)

@interface User : NSObject
@property (nonatomic, assign) int userId;
@property (nonatomic, assign) NSInteger age;
@end// JSON: {"userId": null, "age": null}
User *user = [User yy_modelWithJSON:json];
NSLog(@"%d", user.userId); // 输出: 0
NSLog(@"%ld", user.age);   // 输出: 0
​​结果​​:不会崩溃,int类型会默认设置为 0

2. 对象类型(NSNumber *)

@interface User : NSObject
@property (nonatomic, strong) NSNumber *userId;
@property (nonatomic, strong) NSNumber *age;
@end// JSON: {"userId": null, "age": 25}
User *user = [User yy_modelWithJSON:json];
NSLog(@"%@", user.userId); // 输出: (null)
NSLog(@"%@", user.age);    // 输出: 25
​​结果​​:不会崩溃,对象类型会设置为 nil

安全的使用方式

方式一:使用 NSNumber(推荐)

@interface User : NSObject
@property (nonatomic, strong) NSNumber *userId;
@property (nonatomic, strong) NSNumber *age;// 提供便捷访问方法
- (int)userIdIntValue;
- (int)ageIntValue;
@end@implementation User
- (int)userIdIntValue {return [self.userId intValue]; // 如果为nil返回0
}- (int)ageIntValue {return [self.age intValue]; // 如果为nil返回0
}
@end

方式二:自定义转换方法

@interface User : NSObject
@property (nonatomic, assign) int userId;
@property (nonatomic, assign) int age;// 自定义YYModel转换
+ (NSDictionary *)modelCustomPropertyMapper {return @{@"userId": @"id",@"age": @"age"};
}// 处理null值
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {// 手动处理可能的null值if (dic[@"id"] == [NSNull null]) {_userId = -1; // 设置特殊默认值}if (dic[@"age"] == [NSNull null]) {_age = -1; // 设置特殊默认值}return YES;
}
@end

方式三:使用类别安全解析

@interface NSDictionary (SafeYYModel)
- (id)safeObjectForKey:(id)key;
@end@implementation NSDictionary (SafeYYModel)
- (id)safeObjectForKey:(id)key {id obj = [self objectForKey:key];if (obj == [NSNull null]) {return nil;}return obj;
}
@end// 在model中自定义转换
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {NSNumber *userId = [dic safeObjectForKey:@"id"];_userId = userId ? [userId intValue] : 0;return YES;
}

实际使用建议

推荐方案:使用 NSNumber + 便捷方法

@interface User : NSObject
@property (nonatomic, strong) NSNumber *userId;
@property (nonatomic, strong) NSNumber *age;
@property (nonatomic, strong) NSNumber *height;// 便捷访问方法
- (int32_t)userIdValue;
- (int32_t)ageValue;
- (float)heightValue;// 安全访问方法(带默认值)
- (int32_t)userIdValueWithDefault:(int32_t)defaultValue;
@end@implementation User
- (int32_t)userIdValue {return [self.userId intValue];
}- (int32_t)ageValue {return [self.age intValue];
}- (float)heightValue {return [self.height floatValue];
}- (int32_t)userIdValueWithDefault:(int32_t)defaultValue {return self.userId ? [self.userId intValue] : defaultValue;
}
@end

验证测试

// 测试数据
NSDictionary *json1 = @{@"id": @123, @"age": @25};        // 正常数据
NSDictionary *json2 = @{@"id": [NSNull null], @"age": @25}; // 部分null
NSDictionary *json3 = @{@"id": [NSNull null], @"age": [NSNull null]}; // 全部nullUser *user1 = [User yy_modelWithJSON:json1];
User *user2 = [User yy_modelWithJSON:json2]; 
User *user3 = [User yy_modelWithJSON:json3];// 都不会崩溃
NSLog(@"User1: %d", user1.userId); // 123
NSLog(@"User2: %d", user2.userId); // 0  
NSLog(@"User3: %d", user3.userId); // 0

总结

  • ​​不会崩溃​​:YYModel 对 null值有安全处理
  • ​​基本类型​​:null会被转换为 0
  • ​​对象类型​​:null会被转换为 nil
  • ​​推荐使用 NSNumber​​:更安全,能区分"无值"和"0值"
  • ​​YYModel 在这方面比某些其他JSON库更安全​​
在北京的灯中,有一盏是我家的。这个梦何时可以实现?哪怕微微亮。北京就像魔鬼训练营,有能力的留,没能力的走……

相关新闻

  • 2025年穿线磁珠编带磁环制造企业权威推荐榜单:铁氧体磁环/非晶纳米晶磁环/磁环源头厂家精选
  • 2025年11月中国电线电缆厂家推荐榜单:权威评测与综合排名分析
  • 构建文明的算法:价值原语化、三值纠缠与五维追问——一种AI元人文的实践框架

最新新闻

  • GitHub AI热榜实操解码:从星标数到可运行代码的落地指南
  • 端午静听雨
  • 宁波生成式引擎GEO优化服务商技术实力对比分析 - 起跑123
  • RePKG完全指南:三步解锁Wallpaper Engine资源的终极工具
  • XOutput终极指南:让老旧游戏手柄在现代游戏中焕发新生
  • 天堂寨性价比高好吃吊锅推荐 本地食客实测优选榜单 - 速递信息

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号