JSON转模型工具(Mac)

工欲善其事,必先利其器,要想不加班、少加班,进行高效率工作,开发辅助工具是必不可少的,JSONToModel就是这样一款将JSON字符转换成model代码的开源工具。虽然网上有很多类似工具,但有个共同特点就是没有代码高亮,不美观,有的不支持网络请求将直接JSON数据生成模型代码。
整个工具主要技术要点在于如何使用Textkit富文本进行代码高亮,高亮方法包含正则匹配,OC调用js库,我们知道js有很多强大的高亮库,但OC这方面比较少,混合使用发挥各自语言的优势,模型生成功能就百来行代码,更像一个附加功能,但基本能满足正常开发需求。

功能及技术点:

一、字典转模型代码
  • 对粘贴JSON字符进行空格过滤处理,减少出现JSON数据不合法情况
  • 支持网络请求JSON数据进行模型转换
二、代码高亮
  • 使用正则匹配关键词进行代码高亮
  • 使用highlight.jsjs库进行代码高亮
    正则匹配与js库2种方式进行进行代码高亮,JavaScript有很多优秀的代码高亮库,以后用到代码高亮功能可以直接用js库来处理,在高亮效率,支持语言数量上都是一个不错的选择。

具体实现移步代码:JSONToModel

效果

image

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

quicktypemodelend 不重复造轮子了

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,704评论 7 249
  • 面向对象的程序设计中,某个类把所需要的数据(也可以说是类的属性)和对数据的操作(也可以说是类的行为)全部都封装在类...
    红尘策马阅读 2,701评论 0 2
  • 爸爸躺在客厅的小床上,沉重的呼噜声接连不断。我斜歪在一旁的沙发上,看一本书。 已经一点半了,我想是不是应该推醒爸爸...
    墨镜123456阅读 2,299评论 0 1
  • 关于在简书上写文记事,纯属这个用的方便,不想其他的任何事情,这是初衷。 我写文字,是我自己喜欢,我觉得自己想写点东...
    苏楠雮阅读 1,693评论 0 1
  • 1月份整个人都存在于各种纠结,心里矛盾,压抑,不自信;难过什么的?今天补听老师21天的总结课后,唉,想通了,思维打...
    杨琴一阅读 1,004评论 0 0

友情链接更多精彩内容