工欲善其事,必先利其器,要想不加班、少加班,进行高效率工作,开发辅助工具是必不可少的,JSONToModel就是这样一款将JSON字符转换成model代码的开源工具。虽然网上有很多类似工具,但有个共同特点就是没有代码高亮,不美观,有的不支持网络请求将直接JSON数据生成模型代码。
整个工具主要技术要点在于如何使用Textkit富文本进行代码高亮,高亮方法包含正则匹配,OC调用js库,我们知道js有很多强大的高亮库,但OC这方面比较少,混合使用发挥各自语言的优势,模型生成功能就百来行代码,更像一个附加功能,但基本能满足正常开发需求。
功能及技术点:
一、字典转模型代码
- 对粘贴JSON字符进行空格过滤处理,减少出现JSON数据不合法情况
- 支持网络请求JSON数据进行模型转换
二、代码高亮
- 使用正则匹配关键词进行代码高亮
- 使用highlight.jsjs库进行代码高亮
正则匹配与js库2种方式进行进行代码高亮,JavaScript有很多优秀的代码高亮库,以后用到代码高亮功能可以直接用js库来处理,在高亮效率,支持语言数量上都是一个不错的选择。
具体实现移步代码:JSONToModel
效果
BugFIX:
使用TextKit进行代码高亮时,在iOS上正常,但在Mac OSX上会出现光标错位情况
nstextstorage-syntax-markdown
Why the Selection Changes Do Syntax Highlighting in a NSTextView
Thanks:
AFNetworking
MJExtension
NSTextView-LineNumberView
highlightjs
Python版生成模型代码,基于jinja2模板引擎快速实现
安装jinja2库
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
# 输入变量,生成结果
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)
#测试数据
# jsonDict={
# "name":"jack",
# "address":{"city":"北京", "location":"x,x"},
# "orderList":[{"id":1, "goods":"手机"}, {"id":2, "goods":"电脑"}]
# }
generateModelCode(jsonDict,"Root","HK")
print(modelCodeResult)
if __name__ == '__main__':
appMain()
生成结果
@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转model
quicktype ,modelend 不重复造轮子了
Github:https://github.com/huluo666/JSONToModel
相关工具:
[CSS转JSON] (http://huluo666.cn/2018/03/19/CSS%E8%BD%ACJSON/)
objgen 使用简单语法快速生成JSON
https://app.quicktype.io/ 【荐】
这个在线工具厉害了可以生成objective c,Swift,Java等10几种主流编程语言Model
参考文档
https://github.com/objcio/issue-5-textkit
https://github.com/objcio/S01E91-rendering-markdown-with-syntax-highlighting