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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

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