当开发中你的模型中属性名称和 字典(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":@,
    @"id":@,
    @"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":@,
      @"id":@,
      @"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":@,
      @"id":@,
      @"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":@,
      @"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 = ; 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":@,
      @"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 = ; 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

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

  1. p2p网贷项目开发全过程技术详解,应用框架是ci2.2

    p2p网贷项目开发全过程技术详解,应用框架是ci2.2 很标准的mvc开发代码,代码也很简单,方便二次开发 这篇文章会不断更新

  2. Hadoop 新 MapReduce 框架 Yarn 详解

    Hadoop 新 MapReduce 框架 Yarn 详解: http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/ Ap ...

  3. 测试框架mochajs详解

    测试框架mochajs详解 章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建 ...

  4. 转: javascript模块加载框架seajs详解

    javascript模块加载框架seajs详解 SeaJS是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(模块可按需加载或全部加 ...

  5. Android热门网络框架Volley详解[申明:来源于网络]

    Android热门网络框架Volley详解[申明:来源于网络] 地址:http://www.cnblogs.com/caobotao/p/5071658.html

  6. 【python3+request】python3+requests接口自动化测试框架实例详解教程

    转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...

  7. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

  8. redux-saga框架使用详解及Demo教程

    redux-saga框架使用详解及Demo教程 前面我们讲解过redux框架和dva框架的基本使用,因为dva框架中effects模块设计到了redux-saga中的知识点,可能有的同学们会用dva框 ...

  9. 深拷贝与浅拷贝(mutableCopy与Copy)详解 iOS

    深拷贝与浅拷贝(mutableCopy与Copy)详解 iOS ios中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying 协议的类可以发送copy消息,遵守NSMutab ...

随机推荐

  1. Python自动生成文章

    为了应付某些情况,需要做17份记录.虽然不很重要,但是17份完全雷同也不很好.大体看了一下,此记录大致分为四段.于是决定每段提供四种选项,每段四选一,拼凑成四段文字,存成一个文件.文件名就叫“XX记录 ...

  2. Tomcat appears to still be running with PID 19564. Start aborted

    产生原因:tomcat 异常关闭, 或强行终止导致(如断电等....) 如你所见 .  tomcat 在linux  关, 关不了. 开开不了. 疯狂百度一个小时以后,大致产生问题的原因是,LINUX ...

  3. Hadoop集群_HDFS初探之旅

    1.HDFS简介 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开 ...

  4. Struts2实例详解(转载)

    Struts2(上) 一.        经典的MVC模式 二.        Struts1.x对MVC的实现 三.        Struts1.x的主要组件和作用 组件 作用 ActionSer ...

  5. Android 调用QQ登录

    调用QQ登录        在如今的项目开发.调用第三方登录.差点儿是必须的,而调用QQ登录也是不可缺少的,这里把相关代码分享出来,希望能拿去就能够用,降低项目开发的时间.希望对大家实用. 1,去QQ ...

  6. ArrayList概述

    一. ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境 ...

  7. xcode升级到6.0以后遇到的警告错误解决方法

    Xcode 升级后,常常遇到的遇到的警告.错误,解决方法 从sdk3.2.5升级到sdk 7.1中间废弃了很多的方法,还有一些逻辑关系更加严谨了.1,警告:“xoxoxoxo”  is depreca ...

  8. Hibernate中的Sesson操作

    一.Session概述 Session是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础,相当于JDBC中的Connection.Session对象是通过Session ...

  9. 编译和使用bsdiff

    在android开发中,越到后面生成apk文件越来越大,每次用户更新都是全部下载更新,浪费时间和流量,如果能增量更新就不错了,使用bsdiff就是为了生成更新包 bsdiff下载地址:http://w ...

  10. linux 启动引导器 grub,单用户模式:

    Linux启动引导器 安装linux操作系统的时候就已经将启动引导器安装到硬盘上去了,才能通过硬盘的读取方式启动操作系统. 引导器分为2种: Lilo:功能比较简单,使用比较麻烦,后续发行版中使用gr ...