当开发中你的模型中属性名称和 字典(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

序列化框架MJExtension详解 + iOS ORM框架相关推荐

  1. layUI前端框架使用详解_layUI前端框架视频教程

    百度云网盘下载 ayUI前端框架使用详解_layUI前端框架视频教程 课程目录: 1前言 2为什么要用layUI框架 3layer组件的引用方法 4layer组件的使用方法详解 5用layer组件快速 ...

  2. layUI前端框架使用详解_layUI前端框架视频教程完整版

    layUI前端框架使用详解_layUI前端框架视频教程 课程目录: 1前言 2为什么要用layUI框架 3layer组件的引用方法 4layer组件的使用方法详解 5用layer组件快速开发一个表单验 ...

  3. 后盾人最新layUI前端框架使用详解_layUI前端框架视频教程

    课程目录: 2为什么要用layUI框架 4layer组件的使用方法详解 6layDate组件的使用方法详解 8layUI的基础文件引用 10页面元素之动画.按钮 12页面元素之选项卡.进度条.表格 1 ...

  4. ios怎么引入masonry_详解 iOS 自动布局框架 Masonry

    集成方式 Masonry支持CocoaPods,可以直接通过podfile文件进行集成,需要在CocoaPods中添加下面代码: pod 'Masonry' Masonry 学习建议 在 UI 开发中 ...

  5. gtest测试框架使用详解_测试框架TestNG使用介绍

    近期接触到了一个比较全面的基于Java的接口自动化测试框架,作为一名Java小白,所以打算研究一下,顺带学习学习Java,该测试框架的逻辑控制层使用的HttpClient + TestNG. 在本期中 ...

  6. 网易考拉海购Dubbok框架优化详解

    网易考拉海购Dubbok框架优化详解 摘要:微服务化是当前电商产品演化的必然趋势,网易考拉海购通过微服务化打破了业务爆发增长的架构瓶颈.本文结合网易考拉海购引用的开源Dubbo框架,分享支持考拉微服务 ...

  7. java框架魔乐_16 魔乐科技 SpringBoot框架开发详解

    资源内容: 16 魔乐科技 SpringBoot框架开发详解|____springboot开发代码.rar|____第一章:SpringBoot入门          |____2. SpringBo ...

  8. Java Spring框架入门详解教程【多测师_何sir】

    Spring框架入门详解教程 spring概述 spring结构 spring IOC spring DI spring概述 Spring是一个非常活跃的开源框架, 它是一个基于IOC和AOP来构架多 ...

  9. Spring基于注解TestContext 测试框架使用详解

    原创整理不易,转载请注明出处:Spring基于注解TestContext 测试框架使用详解 代码下载地址:http://www.zuidaima.com/share/1775574182939648. ...

最新文章

  1. 一份值得收藏的,互联网电商购物车架构演变案例
  2. vs2008 c++ 调用java
  3. 高颜值免费在线绘图工具新增WGCNA和差异分析
  4. cadence 常见pcb电阻_高速PCB培训手记
  5. Tensor:索引操作
  6. 【Android】activity-alias的使用
  7. 如何在Go中找到一个对象的类型?
  8. centos rpm安装mysql5.6_CentOS 7下使用RPM安装MySQL 5.6
  9. HTML测试报告模板
  10. 验证码错误的可能问题
  11. 如果矩阵中存在字符用C语言,面试中常见的数据结构与算法题整理,想当架构师,数据结构与算法不过关可不行(数组+字符串,共60题)...
  12. CRMEB打通版简单一步实现类似京东的PLUS会员功能
  13. 3、xx配音狂app登陆算法分析【Android逆向分析学习】
  14. 如何实现业务+项目一体化管理?
  15. java Spring IOC
  16. linux下/proc目录简介
  17. ios打包报错: DXT1 compressed textures are not supported when publishing to iPhone
  18. 腾讯云增强型SSD云硬盘性能方面有哪些特点?
  19. python统计字母出现次数代码用while_py_while循环及基本运算符
  20. 如何使用计算机网络打印机,如何共享网络打印机 共享网络打印机教程详解

热门文章

  1. c#中接口的使用方法图解_c# 接口方法中使用new有什么用?
  2. wps单机无网络版_单平台销量破百万,这个国产单机系列要出网游,还要上主机...
  3. 开课吧java_开课吧javaee企业级开发工程师 十期
  4. 实现编辑功能有哪几个action_Web 应用的撤销重做实现
  5. 华为抢购助手_华为荣耀20系列手机采用的五项新科技,科普简介
  6. 协同过滤算法_机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用
  7. JSP静态导入与动态导入
  8. c++ vector学习
  9. 牛客网与leetcode刷题(高频题中简单or中等的)
  10. leetcode 37. 解数独 思考分析