YYModel,相当精简,一个YYClassInfo类,一个NSObject+YYModel的分类。

YYClassInfo是YYModel对类中属性、成员变量、方法和类属性做的一层封装,后面详解会提到。

NSObject+YYModel工作,就是YYModel的主体工作——JSON转模型

从实例开始

下面是一个实例:

YYBook *book = [YYBook modelWithJSON:@"     \\
{                                           \\
   \\"name\\": \\"Harry Potter\\",              \\
   \\"pages\\": 512,                          \\
   \\"publishDate\\": \\"2010-01-01\\"          \\
}"];

NSObject (YYModel)中,-(instancetype)modelWithJSON:(id)json分两步:

+ (instancetype)modelWithJSON:(id)json {
    NSDictionary *dic = [self _yy_dictionaryWithJSON:json];
    return [self modelWithDictionary:dic];
}

(1)   将JSON转换为字典;

_yy_dictionaryWithJSON:将JSON转换为字典。

+  (NSDictionary *)_yy_dictionaryWithJSON:(id)json {
   if (!json || json == (id)kCFNull) return nil;
   	    NSDictionary *dic = nil;
   	    NSData *jsonData = nil;
   	    if ([json isKindOfClass:[NSDictionary class]]) {
   	        dic = json;
   	    } else if ([json isKindOfClass:[NSString class]]) {
   	        jsonData = [(NSString *)json dataUsingEncoding : NSUTF8StringEncoding];
   	    } else if ([json isKindOfClass:[NSData class]]) {
   	        jsonData = json;
   	    }
   	    if (jsonData) {
   	        dic = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
   	        if (![dic isKindOfClass:[NSDictionary class]]) dic = nil;
   	    }
   	    return dic;
   }

(2)  将字典转换为模型。

+ (instancetype)modelWithDictionary:(NSDictionary *)dictionary {
    if (!dictionary || dictionary == (id)kCFNull) return nil;
    if (![dictionary isKindOfClass:[NSDictionary class]]) return nil;
	  //!!!忽略 这部分不是转model的过程,只是在自定义了转化为自定义类时,需要获取该自定义的类。
    Class cls = [self class];       //cls:YYBook
    _YYModelMeta *modelMeta = [_YYModelMeta metaWithClass:cls];
    if (modelMeta->_hasCustomClassFromDictionary) {
        cls = [cls modelCustomClassForDictionary:dictionary] ?: cls;
    }
    NSObject *one = [cls new];
    if ([one modelSetWithDictionary:dictionary]) return one;
    return nil;
}

字典转模型过程如下:

比如,要初始化一个Shape类对象,根据是否有对应字段来生成不同的子类: