工欲善其事簿煌,必先利其器姨伟,要想不加班豆励、少加班,進(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
效果
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
quicktype ,modelend 不重復(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