MJExtension 使用

使用必备

  • cocoapods下载 MJExtension
  • 抓到的JSON包
  • 插件 ESJsonFormat

实例

  • 创建一个model类,testModel
  • 将抓到的JSON数据直接贴到插件ESJsonFormat中去,生成对应的类
    • 输入


      MJExtension 使用_第1张图片
      调用插件
    • testModel中行程多态,不用另外再去创建多个Model
  • 将property中和关键字重复的属性改名。如json中的id,在property中要改为ID
  • 通常我们做的转化,都是一个类中包含数组,数组又是另一个model组成的,例如:


    MJExtension 使用_第2张图片
    说明

Model实例代码:.h

#import 
typedef enum {
    SexMale,
    SexFemale
} Sex;
@class MJUser;

@interface TestModel : NSObject
@property (strong, nonatomic) NSMutableArray *statuses;/** 存放着某一页微博数据(里面都是Status模型) */
@property (strong, nonatomic) NSArray *ads;/** 存放着一堆的广告数据(里面都是MJAd模型) */
@property (strong, nonatomic) NSNumber *totalNumber;/** 总数 */
@property (assign, nonatomic) long long previousCursor;/** 上一页的游标 */
@property (assign, nonatomic) long long nextCursor;/** 下一页的游标 */
@end

@interface MJStatus : NSObject
@property (copy, nonatomic) NSString *text;/** 微博文本内容 */
@property (strong, nonatomic) MJUser *user;/** 微博作者 */
@end

@interface MJUser : NSObject
@property (copy, nonatomic) NSString *name;/** 名称 */
@property (copy, nonatomic) NSString *ID;/** 头像 */
@property (assign, nonatomic) unsigned int age;/** 年龄 */
@property (strong, nonatomic) NSNumber *height;/** 身高 */
@property (strong, nonatomic) NSDecimalNumber *money;/** 财富 */
@property (assign, nonatomic) Sex sex;/** 性别 */
@property (assign, nonatomic, getter=isGay) BOOL gay;/** 同性恋 */
@end

@interface MJAd : NSObject
@property (copy, nonatomic) NSString *image;/** 广告图片 */
@property (strong, nonatomic) NSURL *url;/** 广告url */
@end

Model.m

#import "TestModel.h"
#import "MJExtension.h"

@implementation TestModel

//+ (NSDictionary *)mj_objectClassInArray
//{
//    return @{
//             @"statuses" : @"MJStatus",
//             @"ads" : @"MJAd"
//             };
//}


+ (NSDictionary *)objectClassInArray{
    return @{@"statuses" : [MJStatus class],
             @"ads" : [MJAd class]};
}

+ (NSDictionary *)mj_replacedKeyFromPropertyName {
    return @{@"ID" : @"id"
             };
}
@end

@implementation MJStatus
@end

@implementation MJUser
@end

@implementation MJAd
@end

MJExtension 几种方法使用说明

  • --- 传入JSON 字符串或字典,直接取出数据 ---
    dict是一串JSON转好的字典
TestModel *model = [TestModel mj_objectWithKeyValues:dict];
  • --- 当JSON的dict字段为关键字(如id)时的映射改变处理 ---
    在TestModel.m中增加映射关系
+(NSDictionary *)mj_replacedKeyFromPropertyName{
    return @{@"ID" : @"id",
             @"desc" : @"desciption",
             };
}
  • --- property为NSArray时必须添加数组的映射 ---
//======================= .h中的声明 =======================
@interface TestModel : NSObject
@property (strong, nonatomic) NSMutableArray *statuses;/** 存放着某一页微博数据(里面都是Status模型) */
...
@end
//======================= .m中的声明 =======================
+(NSDictionary *)objectClassInArray{ //这种方式用插件已经可以直接生成
    return @{@"statuses" : [MJStatus class],
             @"ads" : [MJAd class]};
}
// 或者写成
+(NSDictionary *)mj_objectClassInArray {
    return @{
             @"statuses" : @"MJStatus",
             };
}
  • --- 过滤字典的值(比如字符串日期处理为NSDate、字符串nil处理为@"" ---
    例如一个类MJBook为
@interface MJBook : NSObject
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *publisher;
@property (strong, nonatomic) NSDate *publishedTime;
@property (strong, nonatomic) MJBox *box;
@end

JSON内容为:

    NSDictionary *dict = @{
                           @"name" : @"5分钟突破iOS开发",
                           @"publishedTime" : @"2011-09-10"
                           };
  • publisher一定为空,且publishedTime的类型和JSON传过来的不符
  • 在TestModel.m中增加映射关系
-(id)mj_newValueFromOldValue:(id)oldValue property:(MJProperty *)property {
    if ([property.name isEqualToString:@"publisher"]) { // 过滤掉空的属性值
        if (oldValue == nil) return @"";
    } else if (property.type.typeClass == [NSDate class]) {
        NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
        fmt.dateFormat = @"yyyy-MM-dd";
        return [fmt dateFromString:oldValue];
    }
    return oldValue;
}

你可能感兴趣的:(MJExtension 使用)