简单的 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> |