本發(fā)明涉及iOS開發(fā)建模技術領域,尤其涉及一種模塊生成方法和系統(tǒng)。
背景技術:
在iOS應用特別是基于HTTP的網(wǎng)絡應用開發(fā)中,通常需要將網(wǎng)絡請求的響應數(shù)據(jù),例如JSON、XML等類型的數(shù)據(jù),進行解析并轉化為開發(fā)中方便使用的數(shù)據(jù)結構,這種根據(jù)網(wǎng)絡響應數(shù)據(jù)創(chuàng)建的數(shù)據(jù)結構稱為模塊模型。模型可以在開發(fā)過程中被用于本地數(shù)據(jù)傳輸、持久化等過程中,并且能夠在編譯器的支持下提供內(nèi)部屬性的快速訪問。
目前iOS應用開發(fā)中常見的生成模塊模型的方法主要有如下三種:
1)第一種方案,使用系統(tǒng)自帶的數(shù)據(jù)結構NSDictionary來存儲解析后的網(wǎng)絡響應數(shù)據(jù),此方案只需要一次解析即可完成模型的轉換,但使用起來不方便,主要表現(xiàn)為通過手寫鍵值來訪問內(nèi)部屬性值,容易因拼寫錯誤導致訪問不到目標內(nèi)部屬性值,同時獲取到內(nèi)部屬性值后沒有類型檢查,存在一定的安全隱患。
2)第二種方案,使用根據(jù)服務器返回的數(shù)據(jù)結構手動創(chuàng)建對應的模型數(shù)據(jù)結構,在iOS中,這就需要手動創(chuàng)建模型類,根據(jù)服務器返回數(shù)據(jù)的結構聲明一個個的屬性,然后手動實現(xiàn)由網(wǎng)絡響應數(shù)據(jù)解析得到NSDictionary轉換為模型類的邏輯,此方案的優(yōu)點是能夠在編譯器的支持下提供內(nèi)部屬性的快速訪問,但開發(fā)效率低,如果項目中這樣的模型非常多則需要手寫大量重復的代碼。
3)第二種方案,是使用 Mantle、JSONModel等第三方數(shù)據(jù)庫來幫助創(chuàng)建模型類,此方案中只需要繼承相應的類,然后根據(jù)服務器返回的數(shù)據(jù)結構手寫對應的屬性即可完成第二種方案中所有的功能,大大的簡化了開發(fā)流程。但此方案仍需要手寫屬性,面對大量的建模需求效率不高,而且還可能會因拼寫錯誤引入一些安全隱患,而這些隱患帶來的問題通常也不太容易發(fā)現(xiàn)。
針對現(xiàn)有技術中模型生成的各種方法存在的缺點,找到一種iOS中高效便捷安全的模型生成方法已成為了急需解決的技術問題。
技術實現(xiàn)要素:
本發(fā)明的目的在于提供一種模塊生成方法和系統(tǒng),該方法最終生成的模型類都是基于Mantle、JSONModel等第三方庫的模型的子類,這使得生成的模型類能夠在編譯器的支持下提供內(nèi)部屬性的快捷訪問,避免通過鍵值對訪問帶來的安全性問題。同時,該方法通過提供模型類的文件模板以及自動化腳本,直接接收一個JSON(XML)字符串作為輸入,通過自動化腳本解析并生成輸出包含完整信息的模型類文件,從而避免了模型類屬性和相關方法的手動書寫,進而避免了手動書寫帶來的安全隱患。
本發(fā)明所采用的技術方案如下:
一種模型生成方法,其特征在于,該方法包括:步驟S101,輸入需要解析的字符串,并輸入需要生成的模型的類名XXModel,選擇需要使用的編程語言,選擇需要輸出的模型類型,確定要使用的第三方庫,其中所述第三方庫為Mantle、JSONModel或YYModel中的任意一種;步驟S102,自動化腳本檢查輸入的需要解析的字符串的內(nèi)容是否符合所選擇的需要輸出的模型類型的標準格式;若符合,則字符串有效,進入步驟S103;否則無效,并輸出錯誤信息,并退出結束;步驟S103,自動化腳本使用所述確定要使用的第三方庫對輸入的字符串進行解析和判斷,自動化腳本從模板存儲路徑讀取所選擇的需要輸出的模型類型對應的模板文件,創(chuàng)建模板文件的副本,并進行命名;步驟S104,自動化腳本在內(nèi)存中創(chuàng)建鍵值對集合,用來放置解析結果中的不符合規(guī)范的屬性字段;替換所述模板文件中的類名片段和屬性聲明片段,將不符合規(guī)范的屬性添加到所述集合中,處理不符合規(guī)范的屬性,輸出XXModel.h和XXModel.m文件;步驟S105,將XXModel.h和XXModel.m文件添加到iOS項目中。
優(yōu)選地,所述對輸入的字符串進行解析和判斷具體包括:對輸入的字符串進行解析,若解析失敗,則提示失敗并輸出錯誤信息,并退出結束;若解析成功,則對解析結果進行判斷,若解析結果為數(shù)組類型NSArry類型,則提示類型錯誤并輸出錯誤信息,并退出結束;若解析結果為字典類型NSDictionary類型,則將解析結果輸出。
優(yōu)選地,所述的模板文件具體包括:模板文件為 .h 文件和 .m 文件;在 .h 文件中將模型的類名以第一占位符標識,屬性名稱以第二占位符標識;在 .m文件中同樣將模型的類名以第三占位符標識,屬性名稱以第四占位符標識。
優(yōu)選地,所述輸出XXModel.h具體包括,對于模板文件XXModel.h,自動化腳本定位到XXModel.h中的以第一占位符標識的第一類名片段,并將其替換為XXModel,定位到以第二占位符標識的第一屬性聲明片段,將步驟S104中所創(chuàng)建的集合中存儲的解析結果拼接成屬性聲明語句,并替換掉第二占位符,如果屬性不符合iOS命名規(guī)范,則進行校正,將校正前后的結果以鍵值對的方式寫入所述集合中,輸出XXModel.h文件。
優(yōu)選地,所述輸出XXModel.m具體包括:對于模板文件XXModel. m,自動化腳本定位到XXModel.m中的以第三占位符標識的第二類名片段,并將其替換為XXModel,定位到以第四占位符標識的第二屬性聲明片段,判斷所述集合的內(nèi)容是否為空,如果為空,則說明模型的所有屬性命名符合規(guī)范,刪除第四占位符,輸出XXModel.m文件,進入步驟S105;如果所述集合內(nèi)容不為空,則說明模型的屬性命名中有不符合規(guī)范的部分,在進行屬性名映射后,輸出XXModel.m文件。
一種模型生成系統(tǒng),該生成系統(tǒng)包括輸入和選擇模塊、檢查模塊、第一處理模塊、第二處理模塊以及添加模塊,其特征在于:輸入和選擇模塊,用于輸入需要解析的字符串,并輸入需要生成的模型的類名XXModel,選擇需要使用的編程語言,選擇需要輸出的模型類型,確定要使用的第三方庫,其中所述第三方庫為Mantle、JSONModel或YYModel中的任意一種;檢查模塊,用于自動化腳本檢查輸入的需要解析的字符串的內(nèi)容是否符合所選擇的需要輸出的模型類型的標準格式;若符合,則字符串有效;否則無效,并輸出錯誤信息;第一處理模塊,自動化腳本使用所述確定要使用的第三方庫對輸入的字符串進行解析和判斷,自動化腳本從模板存儲路徑讀取所選擇的需要輸出的模型類型對應的模板文件,創(chuàng)建模板文件的副本,并進行命名;第二處理模塊,自動化腳本在內(nèi)存中創(chuàng)建鍵值對集合,用來放置解析結果中的不符合規(guī)范的屬性字段,替換所述模板文件中的類名片段和屬性聲明片段,將不符合規(guī)范的屬性添加到所述集合中,處理不符合規(guī)范的屬性,輸出XXModel.h和XXModel.m文件;添加模塊,用于將XXModel.h和XXModel.m文件添加到iOS項目中。
優(yōu)選地,第一處理模塊進一步包括解析單元和判斷單元:解析單元,用于對輸入的字符串進行解析,若解析失敗,則提示失敗并輸出錯誤信息;判斷單元,對解析結果進行判斷,若解析結果為數(shù)組類型NSArry類型,則提示類型錯誤并輸出錯誤信息;若解析結果為字典類型NSDictionary類型,則將解析結果輸出。
優(yōu)選地,所述的模板文件具體包括:模板文件為 .h 文件和 .m 文件,在 .h 文件中將模型的類名以第一占位符標識,屬性名稱以第二占位符標識,在 .m文件中同樣將模型的類名以第三占位符標識,屬性名稱以第四占位符標識。
優(yōu)選地,所述第二處理模塊包括第一輸出單元,具體包括:第一輸出單元,用于輸出模板文件XXModel.h,自動化腳本定位到XXModel.h中的以第一占位符標識的第一類名片段,并將其替換為XXModel,定位到以第二占位符標識的第一屬性聲明片段,將所創(chuàng)建的集合中存儲的解析結果拼接成屬性聲明語句,并替換掉第二占位符,如果屬性不符合iOS命名規(guī)范,則進行校正,將校正前后的結果以鍵值對的方式寫入所述集合中,輸出XXModel.h文件。
優(yōu)選地,所述第二處理模塊包括第二輸出單元,具體包括:第二輸出單元,用于輸出模板文件XXModel. m,自動化腳本定位到XXModel.m中的以第三占位符標識的第二類名片段,并將其替換為XXModel,定位到以第四占位符標識的第二屬性聲明片段,判斷所述集合的內(nèi)容是否為空,如果為空,則說明模型的所有屬性命名符合規(guī)范,刪除第四占位符,輸出XXModel.m文件;如果所述集合內(nèi)容不為空,則說明模型的屬性命名中有不符合規(guī)范的部分,在進行屬性名映射后,輸出XXModel.m文件。
本發(fā)明的技術方案所能獲得的有益效果包括,保護針對iOS項目中對服務器返回數(shù)據(jù)進行建模的方案與算法。
附圖說明
圖1為該模型生成方法的流程示意圖;
圖2為該模型生成系統(tǒng)的功能模塊示意圖。
具體實施方式
為了更好的說明本發(fā)明,現(xiàn)結合具體實施例以及說明書附圖對技術方案作進一步的說明。雖然實施例中記載了這些具體的實施方式,然其并非用以限定本發(fā)明,任何所屬技術領域中具有通常知識者,在不脫離本發(fā)明的精神和范圍內(nèi),當可作些許的更動與潤飾,故本發(fā)明的保護范圍當視權利要求書所界定者為準。
該模型生成方法的流程示意圖如圖1所示。
步驟S101,輸入需要解析的字符串,并輸入需要生成的模型的類名XXModel,選擇需要使用的編程語言,選擇需要輸出的模型類型,確定要使用的第三方庫,其中所述第三方庫為Mantle、JSONModel或YYModel中的任意一種;
提供Objective-C和Swift兩種語言項目的模型生成,如果是Objective-C項目則生成 .h和 .m 文件,如果為Swift項目則選擇生成 .swift文件,選擇不同文件類型在解析替換細節(jié)上稍有不同,但整體流程一致,不構成生成算法上的差異;
步驟S102,自動化腳本檢查輸入的需要解析的字符串的內(nèi)容是否符合所選擇的需要輸出的模型類型的標準格式;若符合,則字符串有效,進入步驟S103;否則無效,并輸出錯誤信息,并退出結束;
其中,自動化腳本是指本方案中用到的能夠完成特定功能的在電腦上執(zhí)行的軟件。該步驟主要用于過濾一些非法輸入以提高安全性。
步驟S103,自動化腳本使用所述確定要使用的第三方庫對輸入的字符串進行解析和判斷,自動化腳本從模板存儲路徑讀取所選擇的需要輸出的模型類型對應的模板文件,創(chuàng)建模板文件的副本,并進行命名;
例如,自動化腳本使用iOS系統(tǒng)開發(fā)工具包中所提供的NS JSON Serialization庫來對JSON進行解析,若解析成功,則解析結果為NS Dictionary類型或NS Array類型,這兩種類型是NS JSON Serialization可能的兩種解析結果。其中NS Dictionary類型為鍵值對容器,NS Array類型為數(shù)組容器。若解析失敗,則提示失敗并打印錯誤信息,流程結束。若為NSArray類型,則提示JSON類型錯誤并打印錯誤信息,流程結束。若為NS Dictionary則輸出解析結果,進入步驟S106。
步驟S104,自動化腳本在內(nèi)存中創(chuàng)建鍵值對集合,用來放置解析結果中的不符合規(guī)范的屬性字段;
替換所述模板文件中的類名片段和屬性聲明片段,將不符合規(guī)范的屬性添加到所述集合中,處理不符合規(guī)范的屬性,輸出XXModel.h和XXModel.m文件;
其中模板文件為 .h 文件和 .m 文件,在 .h 文件中將模型的類名以<#ModelName#>占位符標識,屬性名稱以<#PropertyName#>占位符標識,在 .m文件中同樣將模型的類名以<#ModelName#>占位符標識,屬性名稱以<#PropertyMap#>占位符標識。
例如,讀取與JSON Model對應的模板文件JSON Model Template.h和 JSON Model Template.m,創(chuàng)建副本并分別命名為XXModel.h和XXModel.m,模板文件為事先準備好的文件。
在解析結束之后,通過分別查找這些標識符就可以定位到需要替換的位置從而進行替換。在軟件開發(fā)中,客戶端和服務器之間的命名規(guī)范可能存在差異,客戶端獲取到的從服務器返回的數(shù)據(jù)的字段名稱如old_name可能不符合客戶端的命名規(guī)范如oldName,因此需要對從服務器獲取到的字段進行重命名,創(chuàng)建的集合即用來以鍵值對的方式存儲old_name、oldName。
對于模板文件XXModel.h,自動化腳本定位到XXModel.h中的類名片段<#ModelName#>,并將其替換為XXModel,定位到屬性聲明片段<#PropertyName#>,將步驟S107中所創(chuàng)建的集合中存儲的解析結果拼接成屬性聲明語句,并替換掉<#PropertyName#>占位符,如果屬性不符合iOS命名規(guī)范,則進行校正,將校正前后的結果以鍵值對的方式寫入所述集合中,輸出XXModel.h文件。
對于模板文件XXModel.m,自動化腳本定位到XXModel.m中的類名片段<#ModelName#>,并將其替換為XXModel,定位到屬性聲明片段<#PropertyMap#>片段,判斷所述集合的內(nèi)容是否為空,如果為空,則說明模型的所有屬性命名符合規(guī)范,刪除<#PropertyMap#>占位符,輸出XXModel.m文件,進入步驟S109;如果所述集合內(nèi)容不為空,則說明模型的屬性命名中有不符合規(guī)范的部分,在進行屬性名映射后,輸出XXModel.m文件,進入步驟S109。
以JSON為例,在JSON Model的(`+ (JSONKeyMapper *)keyMapper `)方法中將所述集合作為輸入來構造JSON Key Mapper,用此方法替換<#PropertyMap#>占位符,最終輸出XXModel.m文件,進入步驟S110。上述(`+ (JSONKeyMapper *)keyMapper `)方法為JSON Model庫提供的對屬性名做映射的方法,通過此方法可以將JSON 的字段名,例如old_name重命名為需要的任何名稱,例如oldName)。
該步驟主要自動構造了模型的 .h 文件XXModel.h,以及模型的 .m 文件XXModel.m。
步驟S105,將XXModel.h和XXModel.m文件添加到iOS項目中。
在該方法流程中,需要輸入字符串和模型的名稱,并選擇使用的編程語言和第三方庫,其他過程由自動化腳本完成,并提供了直接由字符串到模型的方法和工具。相比傳統(tǒng)的手工添加方法,添加一個模型,需要經(jīng)過人工解析字符串,再創(chuàng)建模型,之后完善屬性這幾個步驟,根據(jù)模型的復雜性不同,耗時30秒到3分鐘不等。該方法只需要提供簡單的輸入即可自動完成模型的生成,耗時5秒以內(nèi),在有大量模型需要創(chuàng)建時,高效優(yōu)勢更明顯。由自動化腳本取代手工,更便捷,增加了字符串有效性驗證,生成內(nèi)容由自動化工具生成,避免了書寫錯誤帶來的安全隱患。
該模型生成系統(tǒng)的功能模塊示意圖如圖2所示。該生成系統(tǒng)包括輸入和選擇模塊、檢查模塊、第一處理模塊、第二處理模塊以及添加模塊,其特征在于:輸入和選擇模塊,用于輸入需要解析的字符串,并輸入需要生成的模型的類名XXModel,選擇需要使用的編程語言,選擇需要輸出的模型類型,確定要使用的第三方庫,其中所述第三方庫為Mantle、JSONModel或YYModel中的任意一種;檢查模塊,用于自動化腳本檢查輸入的需要解析的字符串的內(nèi)容是否符合所選擇的需要輸出的模型類型的標準格式;若符合,則字符串有效;否則無效,并輸出錯誤信息;第一處理模塊,自動化腳本使用所述確定要使用的第三方庫對輸入的字符串進行解析和判斷,自動化腳本從模板存儲路徑讀取所選擇的需要輸出的模型類型對應的模板文件,創(chuàng)建模板文件的副本,并進行命名;第二處理模塊,自動化腳本在內(nèi)存中創(chuàng)建鍵值對集合,用來放置解析結果中的不符合規(guī)范的屬性字段,替換所述模板文件中的類名片段和屬性聲明片段,將不符合規(guī)范的屬性添加到所述集合中,處理不符合規(guī)范的屬性,輸出XXModel.h和XXModel.m文件;添加模塊,用于將XXModel.h和XXModel.m文件添加到iOS項目中。
第一處理模塊進一步包括解析單元和判斷單元:解析單元,用于對輸入的字符串進行解析,若解析失敗,則提示失敗并輸出錯誤信息;判斷單元,對解析結果進行判斷,若解析結果為數(shù)組類型NSArry類型,則提示類型錯誤并輸出錯誤信息;若解析結果為字典類型NSDictionary類型,則將解析結果輸出。
第二處理模塊包括第一輸出單元,第一輸出單元用于輸出模板文件XXModel.h,自動化腳本定位到XXModel.h中的以第一占位符標識的第一類名片段,并將其替換為XXModel,定位到以第二占位符標識的第一屬性聲明片段,將所創(chuàng)建的集合中存儲的解析結果拼接成屬性聲明語句,并替換掉第二占位符,如果屬性不符合iOS命名規(guī)范,則進行校正,將校正前后的結果以鍵值對的方式寫入所述集合中,輸出XXModel.h文件。
第二處理模塊包括第二輸出單元,第二輸出單元用于輸出模板文件XXModel. m,自動化腳本定位到XXModel.m中的以第三占位符標識的第二類名片段,并將其替換為XXModel,定位到以第四占位符標識的第二屬性聲明片段,判斷所述集合的內(nèi)容是否為空,如果為空,則說明模型的所有屬性命名符合規(guī)范,刪除第四占位符,輸出XXModel.m文件;如果所述集合內(nèi)容不為空,則說明模型的屬性命名中有不符合規(guī)范的部分,在進行屬性名映射后,輸出XXModel.m文件。
本領域內(nèi)的技術人員應明白,本發(fā)明的實施例可提供為方法、系統(tǒng)、或計算機程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實施例、完全軟件實施例、或結合軟件和硬件方面的實施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器、CD-ROM、光學存儲器等)上實施的計算機程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實施例的方法、設備(系統(tǒng))、和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設備的處理器以產(chǎn)生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導計算機或其他可編程數(shù)據(jù)處理設備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設備上,使得在計算機或其他可編程設備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機或其他可編程設備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
顯然,本領域的技術人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權利要求及其等同技術的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。