YYModel, MJExtension, JSONModel 对比

2016/12/19 iOS

JSON 模型

使用区别

JSONModel 要求所有模型类必须继承自 JSONModel 基类
YYModel 和 MJExtension 不需要你的模型类继承任何特殊基类,毫无污染,毫无侵入性

量级上

YYModel 和 MJExtension 都是超轻量级框架
YYModel 是一个更轻量级高性能 iOS/OSX 模型转换框架,模型转换性能接近手写解析代码,比 MJExtension 和 JSONModel 性能更高.

字典和模型之间互相转换

MJExtension 支持:
Plist –> Model Array

模型数组 = [模型类名 objectArrayWithFilename:@"文件名.plist"];

JSON Array –> Model Array

NSArray *modelArray = [模型类名 objectArrayWithKeyValuesArray:字段数组];

JSONString –> Model Array
Model Array –> JSON Array
YYModel 没有看到对字典数组和模型数组相互转换的支持

容器类属性

YYModel 需要在 @implementation 和 @end 之间 写上

+ (NSDictionary *)modelContainerPropertyGenericClass {
    return @{@"arrayName" : [模型类名 class]};
}

MJExtension 需要在 @implementation 和 @end 之间 写上

+ (NSDictionary *)objectClassInArray {
    return @{@"arrayName" : [模型类名 class]};
}

MJExtension可以配合ESJsonFormat模型插件使用,插件自动实现容器方法.YYModel也可以配合ESJsonFormat模型插件使用,需要修改容器实现的方法名.

JSONModel 是最简单的,只需要参照以下写法即可

@property (nonatomic) NSArray <ProductModel> *products;

归档和解档

三者性能相当
MJExtension 只需要一行代码调用写好的宏 MJExtensionCodingImplementation 就可以实现
YYModel 需要遵守 NSCoding 协议,并重写下面方法

- (void)encodeWithCoder:(NSCoder *)aCoder { [self yy_modelEncodeWithCoder:aCoder]; }
- (id)initWithCoder:(NSCoder *)aDecoder { self = [super init]; return [self yy_modelInitWithCoder:aDecoder]; }

日志

MJExtension 只需要在@implementation 和 @end 之间写上宏 MJLogAllIvrs,就能解决调试时,打印模型,只打印出内存地址的问题
YYModel 需要重写 description 方法

- (NSString *)description { return [self yy_modelDescription]; }

模型中的属性名和字典中的 key 不相同(或者需要多级映射)

YYModel 需要在 @implementation 和 @end 之间 写上

+ (NSDictionary *)modelCustomPropertyMapper {
    return @{@"name" : @"n",
             @"page" : @"p",
             @"desc" : @"ext.desc",
             @"bookID" : @[@"id",@"ID",@"book_id"]
             };
}

MJExtension 需要在转换代码之前实现

[Student mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
    return @{
               @"ID" : @"id",
               @"desc" : @"desciption",
               @"oldName" : @"name.oldName",
               @"nowName" : @"name.newName",
               @"nameChangedTime" : @"name.info[1].nameChangedTime",
               @"bag" : @"other.bag"
           };
}];

Search

    Table of Contents