让Json和Model相处的融洽点 - 公司荣誉 - 长春市隆兴伟业物流有限公司
现在的位置: 主页 > 公司荣誉 > 文章正文
让Json和Model相处的融洽点
作者:长春市隆兴伟业物流有限公司 来源:www.lxwywl.com 发布时间:2017-09-03 12:06:22
让Json和Model相处的融洽点

iOS里服务器返回来的JsonData通过自带的json解析类或者什么JsonKit,SBJson一类的框架都可以方便的完成解析工作,如果不觉得麻烦的话从这里开始通过KVC取值就完全可以搞定了~可对字符串这种东西进行硬编码...

所以转成Model对象还是比较必要的~而json对象到model对象的映射也有很多东西可以做了~诸如JSONModel,Mantle什么的~最值得一提的是传智播客的当家花旦李明杰老师所写的MJExtension~非常出色,尤其在转化效率上~不敢说今天拿出来的这东西比MJExtension好,只能说更符合笔者自己简单粗暴有效的开发和使用习惯~

经过测试,用我的Macbook对后文给出的1000个相同的测试词典所组成的数组进行映射操作,MJExtension耗时仅0.07秒,而我写的这套工具则花了0.25秒左右...耗时在3~4倍的区间~由于是通过对于模型名称和类的名称进行判断和字符串处理整合来进行映射,更高的耗时也是自然的~通过GCD的并发操作进行处理也并没有太明显的效率提升~

考虑后得到的结论是对每一个模型进行转化的时候都需要对齐内部结构进行完整扫描,对于单个模型的转化这是自然,但是对于数组的整体映射,由于数组保存的模型是相同的,那么长度1000的数组有999次扫描都是没必要的~1:1的线性耗时增加造成了整体的效率降低~作为第一版就先这样吧,毕竟即使没有通过缓存类结构来提升效率,1000个模型0.25秒的映射速度目前来看也还是可以接受的~

接下来说说这究竟是个什么东西

先看一组用来做测试的假数据

-(NSDictionary *)fakeData{ return @{ @name:@jack,@id:@123,@code:@4567890-, @other:@{@attr1:@value1,@attr2:@150,@attr3:@0.8}, @test:@3, @d:@4.5, @l:@3456789, @f:@123.123, @b:@1, @date1:@13567890456, @date2:@2015-4-3 11:18:24, @arr:@[ @{@attr1:@value1,@attr2:@150,@attr3:@0.8}, @{@attr1:@value1,@attr2:@150,@attr3:@0.8}], @path:@{ @third:@{@name:@rose,@age:@123}, @3rd:@{@name:@rose,@age:@123}, @sub:@{ @fourth:@{@name:@rose,@age:@123}, @4th:@{@name:@rose,@age:@123}}} }; }

数据量并不大,可以看到最外层的数据包含了字符串,日期,数字,数组,词典这些常用的数据类型~KEY:`l`对应的@3456789映射到long类型的数据,`f`映射到float类型的数据,虽然目标是数字类型,但是json中究竟是什么格式并没有关系~

而日期方面,可以看出date1使用的是时间戳,而date2使用的是日期字符串~针对于日期数据的处理全部通过NESDateHandler来完成,坦白说这个东西已经可以分出来作为一个独立的日期工具存在了~写这东西的时候多少还是走了点心,不过这倒不是今天的重点~贴出这个类的测试用例就差不多包含了它的全部用法了~完整的测试用例和源码在最后都可以下载

-(void)testBlockHandler { NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @yyyy-MM-dd; NSDate *date1 = [NESDateHandler dateWith:@date:2015-10-10 using:^NSDate *(id object) { NSString *dateString = [[object componentsSeparatedByString:@:] lastObject]; return [fmt dateFromString:dateString]; }]; NSDate *date2 = [fmt dateFromString:@2015-10-10]; XCTAssertEqualObjects(date1, date2); } -(void)testCustomFormatter { NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @yyyy-MM-dd; [NESDateHandler setDateFormatter:fmt]; NSDate *date1 = [NESDateHandler dateWith:@2015-10-10 11:11:11]; NSDate *date2 = [NESDateHandler dateWith:@2015]; //日期字符串不匹配,按照时间戳处理,两者得到的结果应该相同 XCTAssertEqualObjects(date1, date2); date1 = [NESDateHandler dateWith:@2015-10-10]; date2 = [fmt dateFromString:@2015-10-10]; XCTAssertEqualObjects(date1, date2); [NESDateHandler setDateFormatter:[NESDateHandler defaultDateFormatter]]; } -(void)testDefaultDateStringHandler { NSDate *date = [NSDate dateWithTimeIntervalSince1970:60*60*24*365*45 + 60*60*24 * 11]; //45年+11个闰年+8个时区 NSString *str = @2015-01-01 08:00:00; NSString *target = [NESDateHandler stringWith:date]; XCTAssertEqualObjects(str, target); } -(void)testCustomDateStringHandler { NSString *str = @自定义日期处理器; [NESDateHandler setDateStringHandler:^NSString *(NSDate * date) { return @自定义日期处理器; }]; NSString *target = [NESDateHandler stringWith:[NSDate date]]; XCTAssertEqualObjects(str, target); [NESDateHandler setDateStringHandler:[NESDateHandler defaultDateStringHandler]]; } -(void)testCustomDateHandler { [NESDateHandler setDateHandler:^NSDate *(id object) { return [NSDate dateWithTimeIntervalSince1970:60*60*24*365*100]; }]; NSDate *date = [NSDate dateWithTimeIntervalSince1970:60*60*24*365*100]; NSDate *target = [NESDateHandler dateWith:@2015]; XCTAssertNotNil(target); XCTAssertEqualObjects(date, target); [NESDateHandler setDateHandler:[NESDateHandler defaultDateHandler]]; } -(void)testDateFromInvalidateString { NSDate *date = [NESDateHandler dateWith:@a876yikdvhas]; NSDate *dateNow = [NSDate date]; XCTAssertNotNil(date); NSTimeInterval t = dateNow.timeIntervalSince1970 - date.timeIntervalSince1970; XCTAssert(t > 0 && t < 0.001); } -(void)testDateFromTimeInterval { NSDate *date1 = [NESDateHandler dateWith:@2015/4/5 22:11:11.123]; NSDate *date2 = [NESDateHandler dateWith:@2015]; XCTAssertNotNil(date1); XCTAssertNotNil(date2); XCTAssertEqualObjects(date1, date2); } -(void)testDateFromValidateString { NSDate *date1 = [NESDateHandler dateWith:@2014-4-5 22:10:19]; XCTAssertNotNil(date1); }
关于日期字符串的处理倒是MJExtension没有的功能,也是我比较需要的一个东西~接下来就是针对上面的假数据应该如何定义模型了 #import #import NESOtherModel.h #import NESThirdModel.h #import NESFourthModel.h @interface NESDemoModel : NSObject @property (nonatomic,retain) NSString *name; @property (nonatomic,retain) NSString *test_id; @property (nonatomic,retain) NSString *code; @property (nonatomic,retain) NESOtherModel *other; @property (nonatomic,assign) int test; @property (nonatomic,assign) double d; @property (nonatomic,assign) long l; @property (nonatomic,assign) float f; @property (nonatomic,assign) BOOL b; @property (nonatomic,retain) NSDate *date1; @property (nonatomic,retain) NSDate *date2; @property (nonatomic,retain) NSArray *other_arr; @property (nonatomic,retain) NESThirdModel *_path_third; @property (nonatomic,retain) NESThirdModel *_path_3rd; @property (nonatomic,retain) NESFourthModel *_path_sub_fourth; @property (nonatomic,retain) NESFourthModel *_path_sub_4th; @property (nonatomic,assign) NSString * notExists_; @end
没有任何协议,定义时不需要引入额外的头文件,直接继承自NSObject就好~属性的命名规则大体如下:

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站建设公司 https://www.jingchucn.com/zt/wuhan_wangzhanjianshe/


  • 上一篇:卡汀财经分享—CFA考试拥有超常记忆力的小习惯
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 长春市隆兴伟业物流有限公司 ALL RIGHTS RESERVED.
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100