当前位置: 首页 > news >正文

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

使用 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库更安全​
http://www.jsqmd.com/news/50509/

相关文章:

  • 2025年穿线磁珠编带磁环制造企业权威推荐榜单:铁氧体磁环/非晶纳米晶磁环/磁环源头厂家精选
  • 2025年下半年新疆学历提升、成人学历、专升本、自考本科、高起专机构全面评测与选择指南
  • 2025年11月中国电线电缆厂家推荐榜单:权威评测与综合排名分析
  • AI搜索营销新蓝海:五家领先GEO服务商全景透视与战略布局指南
  • 2025年AI搜索时代五大GEO优化服务商全景解析:核心优势与行业适配指南
  • NOIP 模拟赛 9 比赛总结
  • 2025 最新信息平台推荐!工程项目、招投标、招采、政府采购信息查询平台口碑榜,覆盖拟在建项目精准对接服务
  • 2025年无纸化会议软件批发厂家权威推荐榜单:无纸化会议室/平板无纸化会议系统/无纸化升降器源头厂家精选
  • 构建文明的算法:价值原语化、三值纠缠与五维追问——一种AI元人文的实践框架
  • 规范驱动开发:AWS Kiro如何重塑AI编程新范式
  • 2025 最新兽药厂家权威推荐榜:技术专利 + 服务能力双维度测评,优质企业全解析
  • 2025 最新活性炭源头厂家推荐榜:覆盖全品类高端产品,聚焦 85%+ 吸附率与权威测评优选煤质/军工/电极/食品级/医用级活性炭/超级电容炭公司推荐
  • 备份mysql数据库
  • kafka的ISR机制
  • 2025年11月成都律师事务所推荐榜单:主流机构列表与专业服务解析
  • 2025 最新外包公司平台口碑最新推荐榜:权威测评认证的优质服务商,助力企业高效解决用工难题杭州/金华/衢州/温州/台州/绍兴/湖州外包公司推荐
  • 【隐语Secretflow】轻量级隐私计算任务编排框架Kuscia架构解析
  • 快速了解Linux中的lsmod命令
  • 2025年专业的GEO优化实力厂家找哪家,GEO优化杭州服务商推荐TOP5,覆盖多行业需求
  • iOS 混淆应用链实战 多专业的工具组合搞定 IPA 混淆与加固(iOS混淆|IPA加固|无源码加固|App 防反编译)
  • Windows Server 2022 桌面体验版采用Deployment Center 安装TeamCenter 2506 (上)
  • 完整教程:跨厂商(华为 H3C)防火墙 IPSec 隧道部署
  • 2025 最新废气焚烧炉厂家推荐排行榜:聚焦化工医药农药行业,甄选技术创新与合规适配优质企业化工废气焚烧炉/农药废气焚烧炉/医药废气焚烧炉/RTO 废气焚烧炉公司推荐
  • 2025年行业内复购率高的真空包装袋批发厂家口碑推荐榜,真空包装袋推荐排行榜单精选综合实力TOP企业
  • kafka 的ack机制
  • 窗体关闭事件
  • AcWing 788:逆序对的数量 ← 树状数组 + 离散化(数组 + sort + STL map)
  • AI 数据分析如何保障准确性?Aloudata Agent 构建可信数据基础
  • MWD脉冲器电路关键技术与挑战
  • 2025年广东早恋教育机构权威推荐榜单:素质教育/打架/厌学源头机构精选