美文网首页i看不完别走XXX…
MJExtension解析使用详细介绍

MJExtension解析使用详细介绍

作者: coderJerry01 | 来源:发表于2016-07-24 18:33 被阅读805次

    免责声明:写这篇笔记纯属是方便自己以及能使用到的小伙伴们作为参考,方便查找。无任何利益关系。

    本文参考使用说明地址链接: https://github.com/CoderMJLee/MJExtension   (MJ大牛的解析github链接)

    MJExtension解析demo

    开发肯定离不开数据的解析,有时候后台的队友当然也是因为数据的需要才不得已搞出那么多层,各种嵌套,以至于应用开发时解析很蛋疼。我们经常用到解析数据的类库(JSON、XML)有JSONModel 、JSONKit(系统自带iOS 5 后)、MJExtension、GDataXMLNode(需要导入sqlit3)、GDataXML-HTML(直接使用)-------我知道的也是用到过的就这几个;其中关于JSON类型数据的解析效率或者说性能 MJExtension > JSONModel :

    要求所有模型类必须继承自JSONModel基类;

    不需要你的模型类继承任何特殊基类,毫无污染,毫无侵入性;

    MJExtension是一套字典和模型之间互相转换的超轻量级框架

    JSON-->Model、Core Data Model

    JSONString-->Model、Core Data Model

    Model、Core Data Model-->JSON

    JSON Array-->Model Array、Core Data Model Array

    JSONString-->Model Array、Core Data Model Array

    Model Array、Core Data Model Array-->JSON Array

    Coding all properties of model in one line code.

    只需要一行代码,就能实现模型的所有属性进行Coding(归档和解档)

    简单的字典 --> 模型

    JSON字符串 --> 模型

    复杂的字典 --> 模型 (模型里面包含了模型)

    复杂的字典 --> 模型 (模型的数组属性里面又装着模型)

    复杂的字典 --> 模型(模型属性名和字典的key不一样)

    字典数组  -->  模型数组

    模型 --> 字典

    模型数组 --> 字典数组

    字典 --> CoreData模型

    归档与解档NSCoding

    过滤字典的值

    使用方法我就不废话了,你直接拖文件或者cocoapods导入,自己看着弄;然后记得导入头文件就行: #import "MJExtension.h"

    开始放大招了:

    一 、最简单的字典转换为模型

    typedef enum {

    SexMale,

    SexFemale

    } Sex;

    @interface User : NSObject

    @property (copy, nonatomic) NSString *name;

    @property (copy, nonatomic) NSString *icon;

    @property (assign, nonatomic) unsigned int age;

    @property (copy, nonatomic) NSString *height;

    @property (strong, nonatomic) NSNumber *money;

    @property (assign, nonatomic) Sex sex;

    @property (assign, nonatomic, getter=isGay) BOOL gay;

    @end

    /***********************************************/

    NSDictionary *dict = @{

    @"name" : @"Jack",

    @"icon" : @"lufy.png",

    @"age" : @20,

    @"height" : @"1.55",

    @"money" : @100.9,

    @"sex" : @(SexFemale),

    @"gay" : @"true"

    //  @"gay" : @"1"

    //  @"gay" : @"NO"

    };

    // JSON -> User

    User *user = [User mj_objectWithKeyValues:dict];

    NSLog(@"name=%@, icon=%@, age=%zd, height=%@, money=%@, sex=%d, gay=%d", user.name, user.icon, user.age, user.height, user.money, user.sex, user.gay);

    // name=Jack, icon=lufy.png, age=20, height=1.550000, money=100.9, sex=1

    二、模型中嵌套模型

    @interface Status : NSObject

    @property (copy, nonatomic) NSString *text;

    @property (strong, nonatomic) User *user;

    @property (strong, nonatomic) Status *retweetedStatus;

    @end

    /***********************************************/

    NSDictionary *dict = @{

    @"text" : @"Agree!Nice weather!",

    @"user" : @{

    @"name" : @"Jack",

    @"icon" : @"lufy.png"

    },

    @"retweetedStatus" : @{

    @"text" : @"Nice weather!",

    @"user" : @{

    @"name" : @"Rose",

    @"icon" : @"nami.png"

    }

    }

    };

    // JSON -> Status

    Status *status = [Status mj_objectWithKeyValues:dict];

    NSString *text = status.text;

    NSString *name = status.user.name;

    NSString *icon = status.user.icon;

    NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);

    // text=Agree!Nice weather!, name=Jack, icon=lufy.png

    NSString *text2 = status.retweetedStatus.text;

    NSString *name2 = status.retweetedStatus.user.name;

    NSString *icon2 = status.retweetedStatus.user.icon;

    NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2);

    // text2=Nice weather!, name2=Rose, icon2=nami.png

    三、模型中有个数组,数组中有模型

    @interface Ad : NSObject

    @property (copy, nonatomic) NSString *image;

    @property (copy, nonatomic) NSString *url;

    @end

    @interface StatusResult : NSObject

    /** Contatins status model */

    @property (strong, nonatomic) NSMutableArray *statuses;

    /** Contatins ad model */

    @property (strong, nonatomic) NSArray *ads;

    @property (strong, nonatomic) NSNumber *totalNumber;

    @end

    /***********************************************/

    // Tell MJExtension what type model will be contained in statuses and ads.

    [StatusResult mj_setupObjectClassInArray:^NSDictionary *{

    return @{

    @"statuses" : @"Status",

    // @"statuses" : [Status class],

    @"ads" : @"Ad"

    // @"ads" : [Ad class]

    };

    }];

    // Equals: StatusResult.m implements +mj_objectClassInArray method.

    NSDictionary *dict = @{

    @"statuses" : @[

    @{

    @"text" : @"Nice weather!",

    @"user" : @{

    @"name" : @"Rose",

    @"icon" : @"nami.png"

    }

    },

    @{

    @"text" : @"Go camping tomorrow!",

    @"user" : @{

    @"name" : @"Jack",

    @"icon" : @"lufy.png"

    }

    }

    ],

    @"ads" : @[

    @{

    @"image" : @"ad01.png",

    @"url" : @"http://www.ad01.com"

    },

    @{

    @"image" : @"ad02.png",

    @"url" : @"http://www.ad02.com"

    }

    ],

    @"totalNumber" : @"2014"

    };

    // JSON -> StatusResult

    StatusResult *result = [StatusResult mj_objectWithKeyValues:dict];

    NSLog(@"totalNumber=%@", result.totalNumber);

    // totalNumber=2014

    // Printing

    for (Status *status in result.statuses) {

    NSString *text = status.text;

    NSString *name = status.user.name;

    NSString *icon = status.user.icon;

    NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);

    }

    // text=Nice weather!, name=Rose, icon=nami.png

    // text=Go camping tomorrow!, name=Jack, icon=lufy.png

    // Printing

    for (Ad *ad in result.ads) {

    NSLog(@"image=%@, url=%@", ad.image, ad.url);

    }

    // image=ad01.png, url=http://www.ad01.com

    // image=ad02.png, url=http://www.ad02.com

    四、归档、解档

    #import "MJExtension.h"

    @implementation Bag

    // NSCoding Implementation

    MJExtensionCodingImplementation

    @end

    /***********************************************/

    // what properties not to be coded

    [Bag mj_setupIgnoredCodingPropertyNames:^NSArray *{

    return @[@"name"];

    }];

    // Equals: Bag.m implements +mj_ignoredCodingPropertyNames method.

    // Create model

    Bag *bag = [[Bag alloc] init];

    bag.name = @"Red bag";

    bag.price = 200.8;

    NSString *file = [NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/bag.data"];

    // Encoding

    [NSKeyedArchiver archiveRootObject:bag toFile:file];

    // Decoding

    Bag *decodedBag = [NSKeyedUnarchiver unarchiveObjectWithFile:file];

    NSLog(@"name=%@, price=%f", decodedBag.name, decodedBag.price);

    // name=(null), price=200.800000

    五、过滤字典的值

    // Book

    #import "MJExtension.h"

    @implementation Book

    - (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;

    }

    @end

    // NSDictionary

    NSDictionary *dict = @{

    @"name" : @"5分钟突破iOS开发",

    @"publishedTime" : @"2011-09-10"

    };

    // NSDictionary -> Book

    Book *book = [Book mj_objectWithKeyValues:dict];

    // printing

    NSLog(@"name=%@, publisher=%@, publishedTime=%@", book.name, book.publisher, book.publishedTime);

    还有好多用法我没有摘过来,想要具体的了解建议去MJ的github直接参考。MJExtension解析使用详解;

    相关文章

      网友评论

        本文标题:MJExtension解析使用详细介绍

        本文链接:https://www.haomeiwen.com/subject/oofgjttx.html