序列化框架MJExtension详解 + iOS ORM框架

当开发中你的模型中属性名称和 字典(JSON/XML) 中的key 不能一一对应时, 或者当字典中嵌套了多层字典数组时..., 以及教你如何用 MJExtension 配置类来统一管理你的模型配置, 下面罗列了开发中常见的一些特殊情况, 请参考!(MJExtension/github)

  • 最基本用法:

    // 将字典转为模型
    Person *p = [Person mj_objectWithKeyValues:dict2];
    // 将 plist数据转成模型数组
    NSArrar *models =  [Person mj_objectArrayWithFile:@"xx.plist"];
    // 将字典数组转成模型数组, 最常用
    NSArrar *models =  [Person mj_objectArrayWithKeyValuesArray:dict]
  • 1 . 属性名和关键字冲突, 我们需要变更属性名, 比如 JSON 里是 id, 我们最好不要用 id, 又比如 discription, 和系统类重名了
    NSDictionary *dict = @{
                               @"name":@"xiaofei",
                               @"age":@24,
                               @"id":@123456,
                               @"description":@"haoshuai"
                               };
    这时候我们属性就不能命名 id, description 了, 得换一个
    // person.h
    @interface Person : NSObject
    @property(nonatomic, strong) NSString * name;
    @property(nonatomic, assign) NSInteger age;
    @property(nonatomic, strong) NSString * descrip;
    @property(nonatomic, strong) NSString *ID;
    
    @end
    
    光换名字不行, 我们得把换的名字和字典中的 key联系起来, 不然转换成模型后, 属性是没有值得
    
    MJExtension 提供了一个+ mj_replacedKeyFromPropertyName的方法(该方法在模型中使用), 可以把原来字典中的 key 和你修改后的属性再关联起来, 你只要告诉它, 想把什么属性名替换为原来的那个 key
    // person.m
    + (NSDictionary *)mj_replacedKeyFromPropertyName
    {
        return @{
                 // 模型属性: JSON key, MJExtension 会自动将 JSON 的 key 替换为你模型中需要的属性
                 @"ID":@"id",
                 @"descrip":@"description",
                 };
    }

    2 . 字典中又嵌套了一层字典, 示例中的 address, 同时你只需要其中的某一个属性, 没必要再单独搞个模型来转, 你就可以这么做:

    • 注意如果单独搞个模型对应这个字典, MJExtension 是会自动将字典转成模型的, 只有当是字典数组时(字典数组嵌套字典数组才需要其它操作, 参考第4条)
    • NSDictionary *dict = @{
                                 @"name":@"xiaofei",
                                 @"age":@24,
                                 @"id":@123456,
                                 @"description":@"haoshuai",
      
                                 @"address":@{@"province":@"chaohu"},
                                 };

      还是在mj_replacedKeyFromPropertyName中关联, 你只需要将 key 用.连接起来就行了

    • // person.m
      + (NSDictionary *)mj_replacedKeyFromPropertyName
      {
          return @{
                   // 模型属性: JSON key, MJExtension 会自动将 JSON 的 key 替换为你模型中需要的属性
                   @"ID":@"id",
                   @"descrip":@"description",
                   @"address":@"address.province"
                   };
      }

      假如 address key 对应的字典中有很多key,而且嵌套比较深, 不过你仅仅只是想要一个数据, 你还是不想单独搞个模型, 你就还是可以点下去, 比如说下面更复杂的情况, 你只想取出里面狗的名字

      NSDictionary *dict = @{
                                 @"name":@"xiaofei",
                                 @"age":@24,
                                 @"id":@123456,
                                 @"description":@"haoshuai",
      
                                 @"address":@{@"province":@"chaohu",
                                              @"school":@"sitanfu",
                                              @"family":@[@"mm", @"dd", @{@"dog":@"wangcai"}],
                                              },
                                 };
      
      + (NSDictionary *)mj_replacedKeyFromPropertyName
      {
          return @{
                   // 模型属性: JSON key, MJExtension 会自动将 JSON 的 key 替换为你模型中需要的属性
                   @"ID":@"id",
                   @"descrip":@"description",
      //             @"address":@"address.province",
                   @"dogName":@"address.family[2].dog",
                   };
      }

      3 . 可能一些变态的公司一定要让你用驼峰命名, 但服务器返回的数据又都是该死的下划线, 你该怎么办, 别怕, 叔叔教你不用在上一个方法里一个一个对应着改...

      这里要用到 + mj_replacedKeyFromPropertyName121这个方法, 121, 代表 oneToOne...MJ 说的...

      NSDictionary *dict2 = @{
                                  @"name_key":@"xiaoming",
                                  @"age_key":@20,
                                  @"info_key":@"handsome",
                                  };
      
      // person.h
      @property(nonatomic, strong) NSString * nameKey;
      @property(nonatomic, strong) NSString * infoKey;
      @property(nonatomic, assign) NSInteger ageKey;
      
      // person.m
      + (NSString *)mj_replacedKeyFromPropertyName121:(NSString *)propertyName
      {
          // propertyName 是你属性名, 你把属性名格式化成对应字典中 key, 返回就可以了
      
          NSMutableString *key = [NSMutableString string];
          // 遍历propertyName的所有字符
          for (NSInteger i = 0; i < propertyName.length; i++) {
              unichar c = [propertyName characterAtIndex:i];
              if (c >= ‘A‘ && c <= ‘Z‘) { // 大写字母
                  [key appendFormat:@"_%c", c + (‘a‘ - ‘A‘)];
              } else { // 非大写字母
                  [key appendFormat:@"%c", c];
              }
          }
          return key;
      // 其实 MJ的框架里已经实现了这个方法, 你只需一句代码:请跟着我心中默默念一句: 卧槽...
      //   return [propertyName mj_underlineFromCamel];
      }

      4 . 当字典中又包含字典数组时, 模型嵌套, 你要告诉 MJExtension 嵌套模型的类名
      还是先讲在模型类中的做法:

      NSDictionary *dict2 = @{
                                  @"name_key":@"xiaoming",
                                  @"age_key":@20,
                                  @"info_key":@"handsome",
                                  @"users": @[@{@"name":@"xx"}, @{@"name":@"yy"}, @{@"name":@"zz"}],
                                  };
      
      @property(nonatomic, strong) NSString * nameKey;
      @property(nonatomic, strong) NSString * infoKey;
      @property(nonatomic, assign) NSInteger ageKey;
      @property(nonatomic, strong) NSArray * users;
      
      // person.m
      + (NSDictionary *)mj_objectClassInArray
      {
          return @{
                   @"users":@"User",// 或者
      //             @"users":[User class],
                   };
      }

      5 . 前面都是些常规用法, 下面开始装逼...

      所谓高级用法其实就是严密的逻辑加科学的管理(抽抽抽!!!)加牛逼的架构加首席科学家的思想云云...不扯了...

      恩恩..

      以上所有操作都是在我们的模型里面完成的, 这样就对模型造成了一定的污染, 下次我们代码万一不用 MJExtension 了, 那这些模型就都不能用了, 那就哭吧...所以大神 MJ 早就给我们做好了一切, 然后一群菜狗们屁颠屁颠拿来装逼了, 比如本人...

      以上的所有操作都可以不用再模型中操作, 我们可以拿出来放在外面, 比如某个 viewController 里面统一设置

      例子2中这么写, 方法名差不多,只不过换成了 block 回调

      // 例子 2.
          [Person mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
              return @{
                        // 模型属性: JSON key, MJExtension 会自动将 JSON 的 key 替换为你模型中需要的属性
                        @"ID":@"id",
                        @"descrip":@"description",
           //             @"address":@"address.province",
                        @"dogName":@"address.family[2].dog",
                        };
      
          }];
      // 例子 3.
          [Person mj_setupReplacedKeyFromPropertyName121:^NSString *(NSString *propertyName) {
              // propertyName 是你属性名, 你把属性名格式化成对应字典中 key, 返回就可以了
      
                  NSMutableString *key = [NSMutableString string];
                  // 遍历propertyName的所有字符
                  for (NSInteger i = 0; i < propertyName.length; i++) {
                      unichar c = [propertyName characterAtIndex:i];
                      if (c >= ‘A‘ && c <= ‘Z‘) { // 大写字母
                          [key appendFormat:@"_%c", c + (‘a‘ - ‘A‘)];
                      } else { // 非大写字母
                          [key appendFormat:@"%c", c];
                      }
                  }
                  return key;
      // 其实 MJ的框架里已经实现了这个方法, 你只需一句代码:请跟着我心中默默念一句: 卧槽...
      //   return [propertyName mj_underlineFromCamel];
          }];
      // 例子 4.
          [Person mj_setupObjectClassInArray:^NSDictionary *{
              return @{
                        @"users":@"User",// 或者
           //             @"users":[User class],
                        };
          }];
      别急, 还没完, 下面来电思想层面的鸡汤...
      
      没发现其实这些其实都是一次性的设置吗, 开发中我们这样的配置会十分平凡, 感觉上是不是很想抽的冲动...这一堆东西写在控制器里, 而且不一定只是一个控制器, 好多控制器都会有, 只要你需要转模型...
      
      那怎么抽呢, 其实你发现没, 这和我们经常会抽一个专门管理常量的的类的做法, 是不是很类似, 这里我们也是这个需求
      
      所以我们单独抽一个专门配置模型的 MJExtensionConfig类来管理这些配置, 这样不是方便许多吗!!!!所以我们将上面的那些配置统统拿到我们的配置类中
      
      放到哪儿最合适, 当然是 + load中喽
      别急, 还没完, 下面来电思想层面的鸡汤...
      
      没发现其实这些其实都是一次性的设置吗, 开发中我们这样的配置会十分平凡, 感觉上是不是很想抽的冲动...这一堆东西写在控制器里, 而且不一定只是一个控制器, 好多控制器都会有, 只要你需要转模型...
      
      那怎么抽呢, 其实你发现没, 这和我们经常会抽一个专门管理常量的的类的做法, 是不是很类似, 这里我们也是这个需求
      
      所以我们单独抽一个专门配置模型的 MJExtensionConfig类来管理这些配置, 这样不是方便许多吗!!!!所以我们将上面的那些配置统统拿到我们的配置类中
      
      放到哪儿最合适, 当然是 + load中喽

      从如下转载:https://www.jianshu.com/p/11a8e15f7d2b

原文地址:https://www.cnblogs.com/edensyd/p/9139025.html

时间: 2024-11-13 08:06:31

序列化框架MJExtension详解 + iOS ORM框架的相关文章

S2SH框架集成详解(Struts 2.3.16 + Spring 3.2.6 + Hibernate 3.6.10)

近期集成了一次较新版本的s2sh,出现了不少问题,网上资料也是良莠不齐,有的甚至就是扯淡,简单的把jar包扔进去就以为是集成成功了,在这里整理一下详细的步骤,若哪位有什么不同看法,可以留言,欢迎批评改正. 首先说下集成的环境,Eclipse 4.4,Tomcat 7.0.54,Struts2.3.16,Hibernate3.6.10,Spring3.2.6 相关JAR包已上传至百度云:http://pan.baidu.com/s/1pJluA5l 搭建Struts2框架 1. 创建Java We

yii框架AR详解

yii框架AR详解 虽 然Yii DAO可以处理事实上任何数据库相关的任务,但很可能我们会花费90%的时间用来编写一些通用的SQL语句来执行CRUD操作(创建,读取,更新和删除). 同时我们也很难维护这些PHP和SQL语句混合的代码,要解决这些问题,我们可以使用Active Record.    Active Record(AR)是一种流行的对象关系映射(ORM)技术.每个AR类代表一个数据表(或视图),其字段作为AR类的属性,一个AR实例代表在表中的 一行.常见的CRUD操作被作为AR类的方法

测试框架mochajs详解

测试框架mochajs详解 章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建议使用箭头函数 钩子函数 钩子函数的描述参数 异步的钩子函数 全局钩子 延迟启动测试 测试用例TODO 仅执行一个用例集/用例 跳过哪些用例集/用例 重新执行用例 动态生成用例 测试时间 测试超时 用例集执行超时 用例执行超时 钩子函数超时 diff差异比较功能 mocha使用命令和参数 mocha

Java集合框架Koloboke详解

Java集合框架Koloboke详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Koloboke的目标是替换标准的Java集合和流的API,提供更高效的实现.Koloboke目前的版本主要是替换java.util.HashSet和java.util.HashMap. Koloboke提供了一套完整的集合原始类型的实现,可以避免开销很大的装箱/拆箱操作,节省了原始类型装箱消耗的内存. 在Koloboke中,Has

【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】

转的别人的 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成设置账户信息. 确定 ItunesConnect 里 “Contracts, Tax, and Banking”的状态,如下图所示,即可: 这里也是由于Himi疏忽的原因没有说明,这里先给童鞋们带来的麻烦,致以歉意. //——2012-6-25日更新iap恢复 看到很多童鞋说让Himi讲解如何恢复i

无处不在,详解iOS集成第三方登录(SSO授权登录&lt;无需密码&gt;)

1.前言 不多说,第三登录无处不在!必备技能,今天以新浪微博为例. 这是上次写的iOS第三方社交分享:http://www.cnblogs.com/qingche/p/3727559.html 可以和今天的一起集成使用. 2.集成前的准备工作 2.1.去ShareSDK(现为Mob)注册帐号,下载SDK,然后添加自己的应用后得到AppKey 下载地址:http://sharesdk.cn/Download 2.2.申请第三方登录的Appkey 例如: 新浪微博.腾讯微博.QQ.微信.豆瓣应用.人

详解iOS开发之自定义View

iOS开发之自定义View是本文要将介绍的内容,iOS SDK中的View是UIView,我们可以很方便的自定义一个View.创建一个 Window-based Application程序,在其中添加一个Hypnosister的类,这个类选择继承UIObject.修改这个类,使他继承:UIView @interface HypnosisView : UIView 自定义View的关键是定义drawRect: 方法,因为主要是通过重载这个方法,来改变view的外观.例如,可以使用下面代码绘制一个很

详解IOS开发应用之并发Dispatch Queues (2011)

详解IOS开发应用之并发Dispatch Queues是本文哟啊介绍的内容,我们几乎可以调度队列去完成所有用线程来完成的任务.调度队列相对于线程代码更简单,易于使用,更高效.下面讲主要简述调度队列,在应用中如何使用调度队列去执行任务. 1.关于调度队列 所有的调度队列都是先进先出队列,因此,队列中的任务的开始的顺序和添加到队列中的顺序相同.GCD自动的为我们提供了一些调度队列,我们也可以创建新的用于具体的目的. 下面列出几种可用的调度队列类型以及如何使用. (1)serial queues(串行

JavaScript表单序列化的方法详解

本文介绍下,在javascript中实现表单序列化的方法,通过实例加深理解,有需要的朋友参考下吧. 在JavaScript中,可以利用表单字段的type属性,连同name和value属性一起实现对表单的序列. 首先,我们来了解下在表单提交期间,浏览器是怎样将数据发送给服务器的.对表单字段的名称和值进行URL编码,使用和号(&)分割.不发送禁用的表单字段.只发送勾选的复选框和单选按钮.不发送type为"reset"和"button"的按钮.多选择框中的每个选中