把Android的java數(shù)據(jù)模型轉(zhuǎn)換為Objective-C數(shù)據(jù)模型

的這幾天公司項(xiàng)目在重構(gòu),以前Api的返回?cái)?shù)據(jù)的數(shù)據(jù)模型是根據(jù)文檔用GsonFormat自動(dòng)生成的,方便是方便慢逾,但是有很多其實(shí)是同一個(gè)數(shù)據(jù)模型,但是自動(dòng)生成的工具無(wú)法識(shí)別灭红,最終導(dǎo)致我們的模型非常亂侣滩,有很多重復(fù)的Model類(lèi)。
最后我們后端程序是Java寫(xiě)的变擒,他們的數(shù)據(jù)模型其實(shí)丟給我們就能用君珠,所以這次重構(gòu)的時(shí)候就把數(shù)據(jù)模型和后端保持一致了,這就產(chǎn)生了一個(gè)問(wèn)題娇斑,iOS的同學(xué)用的OC策添,還是要手寫(xiě)材部,重構(gòu)代碼 幾百個(gè)model類(lèi),想想就憂(yōu)傷啊唯竹。
所以為了建立我們Android開(kāi)發(fā)同學(xué)和iOS開(kāi)發(fā)同學(xué)的友誼乐导,我們決定用java的類(lèi)為我們iOS的同學(xué)生成他們要的模型。Let go摩窃!

思路

最早是打算直接處理java文件兽叮,把java文件當(dāng)成文本文件,提取里面的字段信息猾愿,用正則表達(dá)式之類(lèi)的提取類(lèi)的元信息字段信息等鹦聪,然后拼成字符串寫(xiě)入到文件里,實(shí)驗(yàn)之后覺(jué)得太麻煩了蒂秘,于是放棄了泽本。
中途也嘗試了一下google的開(kāi)源庫(kù)j2objc,試用之后發(fā)現(xiàn)生成的代碼基本不是給人看的,很多無(wú)關(guān)的信息姻僧,因?yàn)樗饕窍M鸒C能直接調(diào)用java的代碼规丽,不需要人去修改,庫(kù)很完整功能很強(qiáng)大撇贺,但是對(duì)于我的需求來(lái)說(shuō)太過(guò)頭了赌莺,我只希望簡(jiǎn)單的生成一下OC的模型而已。后來(lái)想到就在項(xiàng)目里松嘶,把類(lèi)加載后艘狭,再利用java reflect拿到類(lèi)的所有字段然后改裝成OC的語(yǔ)法寫(xiě)入到文件即可,項(xiàng)目很簡(jiǎn)單翠订,測(cè)試之后基本可用巢音。

部分代碼

下面是解析java模型中數(shù)據(jù)的類(lèi)型,并且對(duì)應(yīng)到oc當(dāng)中的類(lèi)型尽超,可以根據(jù)自己的需求進(jìn)行修改官撼,比如我把double、float似谁、long都是用oc的CGFloat處理了傲绣。

 /**
     * 解析type的信息并存儲(chǔ)在map中,方便后面寫(xiě)入到oc文件
     *
     * @param type
     * @param container
     * @param fieldName
     * @return
     */
    private void saveTypeToMap(Class type, Map<String, String> container,
                               String fieldName, List<String> otherTypeList) {
        String ocType;
        //判斷java類(lèi)的類(lèi)型巩踏,并且對(duì)應(yīng)到oc的類(lèi)型
        if (type == int.class || type == Integer.class) {
            ocType = "NSInteger";
        } else if (type == long.class || type == Long.class) {
            ocType = "CGFloat";
        } else if (type == boolean.class || type == Boolean.class) {
            ocType = "BOOL";
        } else if (type == double.class || type == Double.class) {
            ocType = "CGFloat";
        } else if (type == float.class || type == Float.class || type == BigDecimal.class) {
            ocType = "CGFloat";
        } else if (type == String.class || type == Date.class || type.isEnum()) {
            ocType = "NSString";
        } else if (type == List.class) {
            ocType = "NSArray";
        } else if (type == Object.class) {
            ocType = "NSDictionary";
        } else {
            //如果不是基礎(chǔ)類(lèi)型則為其他的自定義類(lèi)型
            ocType = type.getName();
            int index = ocType.lastIndexOf(".");
            String typeName = classPrefix + ocType.substring(index + 1, ocType.length());
            ocType = typeName;
            if (!otherTypeList.contains(typeName)) {
                otherTypeList.add(typeName);
            }
        }
        //處理特殊字段斜筐,如果字段名稱(chēng)是id或者Category需要特殊處理 這里也可以根據(jù)自己的需要進(jìn)行特別的映射處理
        if (fieldName.equals("id")) {
            container.put("Id", ocType);
        } else if (fieldName.equals("Category")) {
            container.put("HDCategory", ocType);
        } else if (fieldName.equals("Description")) {
            container.put("HDDescription", ocType);
        } else {
            container.put(fieldName, ocType);
        }
    }

使用的時(shí)候把OCTranslator類(lèi)放倒自己的項(xiàng)目里任意位置,然后設(shè)置下下面的內(nèi)容蛀缝,指定一下java模型的包的路徑,然后運(yùn)行即可在項(xiàng)目根目錄生成一個(gè)目錄叫OCModelOutput的文件夾目代,里面就是生成好的OC模型了屈梁。


    //OC模型的前綴
    static String classPrefix = "GD";
    //公司名稱(chēng) 會(huì)顯示到文件頭部的Copyright信息中
    static String corporateName = "Shanghai HEADING Information Engineering Co., Ltd.";
    //顯示到文件頭部到元信息中
    static String schemeName = "TestProject";

    //指定java模型包的路徑
    static String[] modelDirectories = new String[]{

    };

最后看看效果:

1234gif.gif

拋磚引玉嗤练,感興趣的同學(xué)可以試試,說(shuō)不定iOS開(kāi)發(fā)是個(gè)妹子在讶,這一步成功建立友誼之后煞抬,接下來(lái)怎么發(fā)展就看你啦。

項(xiàng)目代碼和demo在這里:
https://github.com/lazydeer/J2OCModel
有需要的朋友快動(dòng)手試試吧构哺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末革答,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子曙强,更是在濱河造成了極大的恐慌残拐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碟嘴,死亡現(xiàn)場(chǎng)離奇詭異溪食,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)娜扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)错沃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人雀瓢,你說(shuō)我怎么就攤上這事枢析。” “怎么了刃麸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵醒叁,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嫌蚤,道長(zhǎng)辐益,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任脱吱,我火速辦了婚禮智政,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箱蝠。我一直安慰自己续捂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布宦搬。 她就那樣靜靜地躺著牙瓢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪间校。 梳的紋絲不亂的頭發(fā)上矾克,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音憔足,去河邊找鬼胁附。 笑死酒繁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的控妻。 我是一名探鬼主播州袒,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼弓候!你這毒婦竟也來(lái)了郎哭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菇存,失蹤者是張志新(化名)和其女友劉穎夸研,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體撰筷,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陈惰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毕籽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抬闯。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖关筒,靈堂內(nèi)的尸體忽然破棺而出溶握,到底是詐尸還是另有隱情,我是刑警寧澤蒸播,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布睡榆,位于F島的核電站,受9級(jí)特大地震影響袍榆,放射性物質(zhì)發(fā)生泄漏胀屿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一包雀、第九天 我趴在偏房一處隱蔽的房頂上張望宿崭。 院中可真熱鬧,春花似錦才写、人聲如沸葡兑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讹堤。三九已至,卻和暖如春厨疙,著一層夾襖步出監(jiān)牢的瞬間洲守,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岖沛,地道東北人暑始。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像婴削,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牙肝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容