简单的 Model 与 JSON 相互转换
1 | // JSON: |
JSON <--> Model-->1
2
3
4
5// 将 JSON (NSData,NSString,NSDictionary) 转换为 Model:
User *user = [User yy_modelWithJSON:json];
// 将 Model 转换为 JSON 对象:
NSDictionary *json = [user yy_modelToJSONObject];
当 JSON/Dictionary 中的对象类型与 Model 属性不一致时,YYModel 将会进行如下自动转换。自动转换不支持的值将会被忽略,以避免各种潜在的崩溃问题。
| JSON/Dictionary | Model |
|---|---|
| NSString | NSNumber, NSURL, SEL, Class |
| NSNumber | NSString |
| NSString/NSNumber | C number (BOOL, int, float, NSUInteger, UInt64, …) NaN and Inf will be ignored |
| NSString | NSDate parsed with these formats: |
| yyyy-MM-dd | yyyy-MM-dd HH:mm:ss yyyy-MM-dd’T’HH:mm:ss yyyy-MM-dd’T’HH:mm:ssZ EEE MMM dd HH:mm:ss Z yyyy |
| NSDate | NSString formatted with ISO8601: “YYYY-MM-dd’T’HH:mm:ssZ” |
| NSValue | struct (CGRect,CGSize,…) |
| NSNull | nil, 0 |
| “no”, “false”, … | @(NO), 0 |
| “yes”, “true”, … | @(YES), 1 |
Model 属性名和 JSON 中的 Key 不相同
1 | // JSON: |
- 你可以把一个或一组
json key (key path)映射到一个或多个属性。如果一个属性没有映射关系,那默认会使用相同属性名作为映射。 - 在
json->model的过程中:如果一个属性对应了多个json key,那么转换过程会按顺序查找,并使用第一个不为空的值。 - 在
model->json的过程中:如果一个属性对应了多个json key (key path),那么转换过程仅会处理第一个json key (key path);如果多个属性对应了同一个json key,则转换过过程会使用其中任意一个不为空的值。
Model 包含其他的 Model
1 | // JSON |
容器类属性
1 | @class Shadow, Border, Attachment; |
在实际使用过过程中,[Shadow class], Border.class, @"Attachment" 没有明显的区别。
黑名单与白名单
1 | @interface User |
数据校验与自定义转换
实际这个分类的目的比较简单和明确。 就是对判断是否为时间戳,然后对时间戳进行处理,调用 _createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue]; 获取时间。
1 | // JSON: |
Coding/Copying/hash/equal/description
以下方法都是YYModel的简单封装,实际使用过程和系统方法区别不大。对其感兴趣的可以点进方法内部查看。
1 | @interface YYShadow :NSObject <NSCoding, NSCopying> |