序列化框架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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运行keras出现 FutureWarning: Passing (type, 1) or ‘1type‘ as a synonym of type is deprecated解决办法

运行keras出现 FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, 原则来说&#xff0c;没啥影响&#xff0c;还是能运行&#xff0c;但是看着难受 解决办法&#xff1a; 点击蓝色的链接&#xff1a; 进入 …

RedirectToAction()转移方式及参数传递

今天在做一个功能的时&#xff0c;使用RedirectToAction()需要从这里传几个参数&#xff0c;从网上查了一下&#xff0c;这样解决。真好。 Return RedirectToAction("Index","ManageInfo",new{type0,page1});转载于:https://www.cnblogs.com/ZaraNet/p/978…

软件项目风险管理

近几年来软件开发技术、工具都有了很大的进步&#xff0c;但是软件项目开发超时、超支、甚至不能满足用户需求而根本没有得到实际使用的情况仍然比比皆是。软件项目开发和管理中一直存在着种种不确定性&#xff0c;严重影响着项目的顺利完成和提交。但这些软件风险并未得到充分…

mongdb 群集_群集文档的文本摘要

mongdb 群集This is a part 2 of the series analyzing healthcare chart notes using Natural Language Processing (NLP)这是使用自然语言处理(NLP)分析医疗保健图表笔记的系列文章的第2部分。 In the first part, we talked about cleaning the text and extracting sectio…

keras框架实现手写数字识别

详细细节可学习从零开始神经网络&#xff1a;keras框架实现数字图像识别详解&#xff01; 代码实现&#xff1a; [1]将训练数据和检测数据加载到内存中(第一次运行需要下载数据&#xff0c;会比较慢): &#xff08;mnist是手写数据集&#xff09; train_images是用于训练系统…

gdal进行遥感影像读写_如何使用遥感影像进行矿物勘探

gdal进行遥感影像读写Meet Jose Manuel Lattus, a geologist from Chile. In the latest Soar Cast, he discusses his work in mineral exploration and environmental studies, and explains how he makes a living by creating valuable information products based on diff…

从零开始神经网络:keras框架实现数字图像识别详解!

接口实现可参考&#xff1a;keras框架实现手写数字识别 思路&#xff1a; 我们的代码要导出三个接口&#xff0c;分别完成以下功能&#xff1a; 初始化initialisation&#xff0c;设置输入层&#xff0c;中间层&#xff0c;和输出层的节点数。训练train:根据训练数据不断的更…

大数据学习第一贴

搞了这么久的开发&#xff0c;一直没有养成发博客的习惯&#xff0c;今天开始对大数据所需内容进行总结性记录&#xff0c;并对以后遇到的问题形成一个自己的知识库。就这些&#xff01;转载于:https://blog.51cto.com/13921538/2299765

推荐算法的先验算法的连接_数据挖掘专注于先验算法

推荐算法的先验算法的连接So here we are diving into the world of data mining this time, let’s begin with a small but informative definition;因此&#xff0c;这一次我们将进入数据挖掘的世界&#xff0c;让我们从一个小的但内容丰富的定义开始&#xff1b; 什么是数…

Android 页面多状态布局管理

一、现状 页面多状态布局是开发中常见的需求&#xff0c;即页面在不同状态需要显示不同的布局&#xff0c;实现的方式也比较多&#xff0c;最简单粗暴的方式就是在 XML 中先将不同状态对应的布局隐藏起来&#xff0c;根据需要改变其可见状态&#xff0c;如果多个界面公用相同的…

Tensorflow入门神经网络代码框架

Tensorflow—基本用法 使用图 (graph) 来表示计算任务.在被称之为 会话 (Session) 的上下文 (context) 中执行图.使用 tensor 表示数据.通过 变量 (Variable) 维护状态.使用 feed 和 fetch 可以为任意的操作(arbitrary operation)赋值或者从其中获取数据。 • TensorFlow 是一…

手把手教你把代码丢入github 中

手把手教你把代码丢入github 中 作为一个小运维一步步教你们怎么把代码放入到github 中 首先呢我们下载一个git的客户端 https://git-scm.com/downloads/ 下载一个最新版的2.16.2 下载后那就安装吧。如果看不懂英文就选择默认安装的方式吧。但是你得记住你的软件安装的位置 小…

时间序列模式识别_空气质量传感器数据的时间序列模式识别

时间序列模式识别 1. Introduction 2. Exploratory Data Analysis ∘ 2.1 Pattern Changes ∘ 2.2 Correlation Between Features 3. Anomaly Detection and Pattern Recognition ∘ 3.1 Point Anomaly Detection (System Fault) ∘ 3.2 Collective Anomaly Detection (Externa…

oracle 性能优化 07_诊断事件

2019独角兽企业重金招聘Python工程师标准>>> 一、诊断事件 诊断事件无官方技术文档支持&#xff0c;使用存在风险&#xff0c;慎用。使用诊断事件可以获取问题更多的信息&#xff0c;调整系统运行 特性&#xff0c;启用某些内部功能。用于系统故障的诊断。跟踪应…

Tensorflow框架:卷积神经网络实战--Cifar训练集

Cifar-10数据集包含10类共60000张32*32的彩色图片&#xff0c;每类6000张图。包括50000张训练图片和 10000张测试图片 代码分为数据处理部分和卷积网络训练部分&#xff1a; 数据处理部分&#xff1a; #该文件负责读取Cifar-10数据并对其进行数据增强预处理 import os impo…

计算机科学速成课36:自然语言处理

词性 短语结构规则 分析树 语音识别 谱图 快速傅里叶变换 音素 语音合成 转载于:https://www.cnblogs.com/davidliu2018/p/9149252.html

linux内存初始化初期内存分配器——memblock

2019独角兽企业重金招聘Python工程师标准>>> 1.1.1 memblock 系统初始化的时候buddy系统&#xff0c;slab分配器等并没有被初始化好,当需要执行一些内存管理、内存分配的任务&#xff0c;就引入了一种内存管理器bootmem分配器。 当buddy系统和slab分配器初始化好后&…

数据科学学习心得_学习数据科学

数据科学学习心得苹果 | GOOGLE | 现货 | 其他 (APPLE | GOOGLE | SPOTIFY | OTHERS) Editor’s note: The Towards Data Science podcast’s “Climbing the Data Science Ladder” series is hosted by Jeremie Harris. Jeremie helps run a data science mentorship startup…

Keras框架:Alexnet网络代码实现

网络思想&#xff1a; 1、一张原始图片被resize到(224,224,3)&#xff1b; 2、使用步长为4x4&#xff0c;大小为11的卷积核对图像进行卷积&#xff0c;输出的特征层为96层&#xff0c; 输出的shape为(55,55,96)&#xff1b; 3、使用步长为2的最大池化层进行池化&#xff0c;此时…

PHP对象传递方式

<?phpheader(content-type:text/html;charsetutf-8);class Person{public $name;public $age;}$p1 new Person;$p1->name 金角大王;$p1->age 400;//这个地方&#xff0c;到底怎样?$p2 $p1;$p2->name 银角大王;echo <pre>;echo p1 name . $p1->n…