序列化框架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.pswp.cn/news/389503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389503.shtml
英文地址,請注明出處:http://en.pswp.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…