JSON轉(zhuǎn)模型工具(Mac)

工欲善其事簿煌,必先利其器姨伟,要想不加班豆励、少加班,進(jìn)行高效率工作技扼,開發(fā)輔助工具是必不可少的,JSONToModel就是這樣一款將JSON字符轉(zhuǎn)換成model代碼的開源工具剿吻。雖然網(wǎng)上有很多類似工具串纺,但有個(gè)共同特點(diǎn)就是沒有代碼高亮,不美觀榄笙,有的不支持網(wǎng)絡(luò)請(qǐng)求將直接JSON數(shù)據(jù)生成模型代碼祷蝌。
整個(gè)工具主要技術(shù)要點(diǎn)在于如何使用Textkit富文本進(jìn)行代碼高亮,高亮方法包含正則匹配乡翅,OC調(diào)用js庫(kù)蠕蚜,我們知道js有很多強(qiáng)大的高亮庫(kù)靶累,但OC這方面比較少癣疟,混合使用發(fā)揮各自語言的優(yōu)勢(shì),模型生成功能就百來行代碼邪蛔,更像一個(gè)附加功能扎狱,但基本能滿足正常開發(fā)需求。

功能及技術(shù)點(diǎn):

一匠抗、字典轉(zhuǎn)模型代碼
  • 對(duì)粘貼JSON字符進(jìn)行空格過濾處理污抬,減少出現(xiàn)JSON數(shù)據(jù)不合法情況
  • 支持網(wǎng)絡(luò)請(qǐng)求JSON數(shù)據(jù)進(jìn)行模型轉(zhuǎn)換
二印机、代碼高亮
  • 使用正則匹配關(guān)鍵詞進(jìn)行代碼高亮
  • 使用highlight.jsjs庫(kù)進(jìn)行代碼高亮
    正則匹配與js庫(kù)2種方式進(jìn)行進(jìn)行代碼高亮,JavaScript有很多優(yōu)秀的代碼高亮庫(kù)踏堡,以后用到代碼高亮功能可以直接用js庫(kù)來處理咒劲,在高亮效率,支持語言數(shù)量上都是一個(gè)不錯(cuò)的選擇帐偎。

具體實(shí)現(xiàn)移步代碼:JSONToModel

效果

image

BugFIX:

使用TextKit進(jìn)行代碼高亮?xí)r削樊,在iOS上正常,但在Mac OSX上會(huì)出現(xiàn)光標(biāo)錯(cuò)位情況
nstextstorage-syntax-markdown
Why the Selection Changes Do Syntax Highlighting in a NSTextView

Thanks:

AFNetworking
MJExtension
NSTextView-LineNumberView
highlightjs

Python版生成模型代碼甸箱,基于jinja2模板引擎快速實(shí)現(xiàn)

安裝jinja2庫(kù)
pip install jinja2

generateModelCode(jsonDict,"Root","前綴")

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Date    : 2022/2/28
# @Author  : jenkins
# @Version : V1.0
# @Features: 生成OC模型代碼

#https://aider.meizu.com/app/weather/listWeather?cityIds=101280101
from urllib import request
from jinja2 import Template
import json

modelCodeResult=""
modelTmpl="""
@interface {{MODEL_NAME}} : NSObject 
{% set dict_item =  VAR_DICT %}
{% for key, value in dict_item.items() -%}
{% if is_list(value) -%}
@property (nonatomic, copy)   NSArray<{{PREFIX}}{{key|title}}Model> *{{key}};
{% elif value is  number -%}
@property (nonatomic, assign)   NSInteger {{key}};
{% elif value is  mapping -%}
@property (nonatomic, strong)   {{PREFIX}}{{key|title}}Model *{{key}};
{% else -%}
@property (nonatomic, strong)   NSString *{{key}};
{% endif -%}
{% endfor %}
@end
"""

def is_list(value):
    return isinstance(value, list)

def render(tmpl, *args, **kwds):
    '''jinja2 render'''
    vars = dict(*args, **kwds)
    #載入模板
    tmp = Template(tmpl)    
    tmp.globals['is_list'] = is_list
    # 輸入變量芍殖,生成結(jié)果
    return tmp.render(vars).strip()

def generateModelCode(jsonDict,key,prefix):
    global modelCodeResult
    result = render(modelTmpl,VAR_DICT=jsonDict,MODEL_NAME=prefix+key.title()+"Model",PREFIX=prefix)
    modelCodeResult+=result+"\n\n\n";
    for key, value in jsonDict.items():
        if type(value)==list:
            subDict=value[0]
            generateModelCode(subDict,key,prefix)
        elif type(value)==dict:
            generateModelCode(value,key,prefix)
        else:
            pass
    
def appMain():
    url = "https://aider.meizu.com/app/weather/listWeather?cityIds=101280101"
    req = request.Request(url=url, headers={})
    res = request.urlopen(req)
    jsonStr=res.read().decode()
    jsonDict=json.loads(jsonStr)
    #測(cè)試數(shù)據(jù)   
#   jsonDict={
#       "name":"jack", 
#       "address":{"city":"北京", "location":"x,x"},
#       "orderList":[{"id":1, "goods":"手機(jī)"}, {"id":2, "goods":"電腦"}]
#   }
    generateModelCode(jsonDict,"Root","HK")
    print(modelCodeResult)
    
if __name__ == '__main__':
    appMain()

生成結(jié)果

@interface HKRootModel : NSObject 

@property (nonatomic, strong)   NSString *name;
@property (nonatomic, strong)   HKAddressModel *address;
@property (nonatomic, copy)   NSArray<HKOrderlistModel> *orderList;

@end

@interface HKAddressModel : NSObject 

@property (nonatomic, strong)   NSString *city;
@property (nonatomic, strong)   NSString *location;

@end

@interface HKOrderlistModel : NSObject 

@property (nonatomic, assign)   NSInteger id;
@property (nonatomic, strong)   NSString *goods;

@end

推薦使用在線json轉(zhuǎn)model

quicktypemodelend 不重復(fù)造輪子了

Github:https://github.com/huluo666/JSONToModel

相關(guān)工具:
[CSS轉(zhuǎn)JSON] (http://huluo666.cn/2018/03/19/CSS%E8%BD%ACJSON/)
objgen 使用簡(jiǎn)單語法快速生成JSON
https://app.quicktype.io/ 【薦】
這個(gè)在線工具厲害了可以生成objective c窃躲,Swift钦睡,Java等10幾種主流編程語言Model

參考文檔

https://github.com/objcio/issue-5-textkit
https://github.com/objcio/S01E91-rendering-markdown-with-syntax-highlighting

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赎婚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纬凤,更是在濱河造成了極大的恐慌撩嚼,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恋技,死亡現(xiàn)場(chǎng)離奇詭異蜻底,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瞳步,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搏嗡,“玉大人,你說我怎么就攤上這事旧乞。” “怎么了抽碌?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)左权。 經(jīng)常有香客問我,道長(zhǎng)屡贺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任甩栈,我火速辦了婚禮糕再,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘殴蹄。我一直安慰自己猾担,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布稽荧。 她就那樣靜靜地躺著工腋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夷蚊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天筋现,我揣著相機(jī)與錄音矾飞,去河邊找鬼。 笑死豹绪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞒津。 我是一名探鬼主播括尸,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼濒翻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了有送?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤裸删,失蹤者是張志新(化名)和其女友劉穎烁落,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伤塌,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧铁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年齿风,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片童本。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脸候,死狀恐怖绑蔫,靈堂內(nèi)的尸體忽然破棺而出配深,到底是詐尸還是另有隱情,我是刑警寧澤嫁盲,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布羞秤,位于F島的核電站,受9級(jí)特大地震影響瘾蛋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一幸斥、第九天 我趴在偏房一處隱蔽的房頂上張望咬扇。 院中可真熱鬧,春花似錦懈贺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至皮迟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伏尼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工燥透, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兽掰。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓孽尽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親杉女。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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

  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,365評(píng)論 7 249
  • 面向?qū)ο蟮某绦蛟O(shè)計(jì)中陨晶,某個(gè)類把所需要的數(shù)據(jù)(也可以說是類的屬性)和對(duì)數(shù)據(jù)的操作(也可以說是類的行為)全部都封裝在類...
    紅塵策馬閱讀 336評(píng)論 0 2
  • 爸爸躺在客廳的小床上褐耳,沉重的呼嚕聲接連不斷撮躁。我斜歪在一旁的沙發(fā)上,看一本書把曼。 已經(jīng)一點(diǎn)半了,我想是不是應(yīng)該推醒爸爸...
    墨鏡123456閱讀 268評(píng)論 0 1
  • 關(guān)于在簡(jiǎn)書上寫文記事注盈,純屬這個(gè)用的方便老客,不想其他的任何事情,這是初衷胧砰。 我寫文字,是我自己喜歡尉间,我覺得自己想寫點(diǎn)東...
    蘇楠雮閱讀 224評(píng)論 0 1
  • 1月份整個(gè)人都存在于各種糾結(jié),心里矛盾贪薪,壓抑眠副,不自信;難過什么的囱怕?今天補(bǔ)聽老師21天的總結(jié)課后,唉娃弓,想通了,思維打...
    楊琴一閱讀 87評(píng)論 0 0