iOS Json數(shù)據(jù)自動生成 Model 文件

GitHub 地址:JSONDemo

前言

當我們在創(chuàng)建數(shù)據(jù)Model時候嬉愧,如網(wǎng)絡請求數(shù)據(jù)過于復雜這時候就需要花費大量時間來創(chuàng)建數(shù)據(jù)模型芽狗,為了方便快捷,于是就引入了如下工具來將Json轉(zhuǎn)換成Model文件佳吞。

我也已經(jīng)將此項目打包生成Dmg文件放在Res文件夾當中,如需要下載安裝即可
Dmg文件

可視化界面操作

WX20191012-114934@2x.png

將需要轉(zhuǎn)換的json字符串放在坐標框內(nèi)棉安,轉(zhuǎn)換即可

實現(xiàn)代碼

//
//  ViewController.m
//  KJJsonToModelDemo
//
//  Created by 楊科軍 on 2019/10/12.
//  Copyright ? 2019 楊科軍. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong) NSMutableArray *temps;
@property (weak) IBOutlet NSButton *annotationButton;
@property (weak) IBOutlet NSTextField *jsonTextField;
@property (weak) IBOutlet NSTextField *annotationTextField;
@property (weak) IBOutlet NSTextField *githubLabel;
@property (unsafe_unretained) IBOutlet NSTextView *modelTextView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.temps = [NSMutableArray array];
    // Do any additional setup after loading the view.
}


- (void)setRepresentedObject:(id)representedObject {
    [super setRepresentedObject:representedObject];

    // Update the view, if already loaded.
}

#pragma mark - json轉(zhuǎn)字典
- (NSDictionary *)getDictWithJsonString:(NSString *)jsonString{
    jsonString = [[[[jsonString stringByReplacingOccurrencesOfString:@"\n" withString:@""]stringByReplacingOccurrencesOfString:@"\t" withString:@""]stringByReplacingOccurrencesOfString:@" " withString:@""]stringByReplacingOccurrencesOfString:@"\\" withString:@""];
    /// 解析字典
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@";};" withString:@"};"];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@";}" withString:@"}"];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@";" withString:@","];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"=" withString:@":"];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"(" withString:@"["];
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@")" withString:@"]"];
    NSString *regex = @"[,{].*?:";
    NSError *error;
    NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:&error];
    NSArray *matches = [regular matchesInString:jsonString options:0 range:NSMakeRange(0, jsonString.length)];
    NSMutableString* jsonMuStr = [[NSMutableString alloc]initWithString:jsonString];
    int i = 1;
    for (NSTextCheckingResult *match in matches) {
        NSRange range = [match range];
        NSString *mStr = [jsonString substringWithRange:range];
        if(![mStr containsString:@"\""]){
            [jsonMuStr insertString:@"\"" atIndex:range.location + i];
            i += 2;
            [jsonMuStr insertString:@"\"" atIndex:range.location + i + range.length - 3];
        }
    }
    ///
    jsonString = [self correctErrValueWithJsonString:jsonMuStr];
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *err;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
    if(err) {
        [self errorHint];
        return nil;
    }
    return dic;
}
- (NSString *)correctErrValueWithJsonString:(NSString *)jsonStr{
    NSString *regex = @":.*?,";
    NSError *error;
    NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:&error];
    NSArray *matches = [regular matchesInString:jsonStr options:0 range:NSMakeRange(0, jsonStr.length)];
    NSMutableString* jsonMuStr = [[NSMutableString alloc]initWithString:jsonStr];
    int i = 1;
    for (NSTextCheckingResult *match in matches) {
        NSRange range = [match range];
        NSString *mStr = [jsonStr substringWithRange:range];
        if(mStr.length > 2)
        mStr = [mStr substringWithRange:NSMakeRange(1, mStr.length - 2)];
        if(![mStr containsString:@"\""] && ![self isPureNumber:mStr] && ![mStr containsString:@"}"] && ![mStr containsString:@"["] && ![mStr containsString:@"true"] && ![mStr containsString:@"false"]){
            [jsonMuStr insertString:@"\"" atIndex:range.location + i];
            i += 2;
            [jsonMuStr insertString:@"\"" atIndex:range.location + i + range.length - 3];
        }
    }
    return jsonMuStr;
}
- (BOOL)isPureNumber:(NSString*)string{
    return [self isPureInt:string] || [self isPureFloat:string];
}
- (BOOL)isPureInt:(NSString*)string{
    NSScanner* scan = [NSScanner scannerWithString:string];
    int val;
    return[scan scanInt:&val] && [scan isAtEnd];
}
- (BOOL)isPureFloat:(NSString*)string{
    NSScanner* scan = [NSScanner scannerWithString:string];
    float val;
    return[scan scanFloat:&val] && [scan isAtEnd];
}
/// 錯誤提示
- (void)errorHint{
    NSAlert *alert = [[NSAlert alloc]init];
    [alert addButtonWithTitle:@"確定"];
    alert.messageText = @"錯誤";
    alert.informativeText = @"json字符串不合法";
    [alert setAlertStyle:NSAlertStyleWarning];
    [alert beginSheetModalForWindow:[self.view window] completionHandler:^(NSModalResponse returnCode) {
        
    }];
}
/// 開始轉(zhuǎn)換
- (IBAction)thouchTransformButtonAction:(NSButton *)sender {
    [self.temps removeAllObjects];
    NSString *jsonStr = self.jsonTextField.stringValue;
    if(!jsonStr.length){
        [self errorHint];
        return;
    }
    NSDictionary *resultDic = [self getDictWithJsonString:jsonStr];
    [self recursionForResultWithObj:resultDic];
    NSMutableArray *finalResultArr = [NSMutableArray array];
    for (NSArray *subArr in self.temps) {
        if(![finalResultArr containsObject:subArr]){
            [finalResultArr addObject:subArr];
        }
    }
    finalResultArr = (NSMutableArray *)[[finalResultArr reverseObjectEnumerator] allObjects];
    NSString *outputString = @"";
    /// 分割注釋
    NSArray *annArr = [self.annotationTextField.stringValue componentsSeparatedByString:@"\n"];
    NSInteger count = annArr.count;
    for (NSArray *subArr in finalResultArr) {
        outputString = [outputString stringByAppendingString:@"************分割線************\n"];
        for (NSInteger i=0; i<subArr.count; i++) {
            NSString *tempString;
            NSString *string = subArr[i];
            if(self.annotationButton.state == NSControlStateValueOn){
                NSString *annStr = @"";
                if (i<count) {
                    annStr = annArr[i];
                }
               tempString = [NSString stringWithFormat:@"http:/// %@\n%@",annStr,string];
            }else{
               tempString = string;
            }
            outputString = [outputString stringByAppendingString:tempString];
        }
    }
    self.modelTextView.string = outputString;   
}
#pragma mark - 遞歸解析
- (void)recursionForResultWithObj:(id)obj{
    if([obj isKindOfClass:[NSArray class]]){
        for (id subObj in obj) {
            [self recursionForResultWithObj:subObj];
        }
    }else if([obj isKindOfClass:[NSDictionary class]]){
        NSMutableArray *temp = [NSMutableArray array];
        for (NSString *key in ((NSDictionary*)obj).allKeys){
            id value = [obj objectForKey:key];
            if([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSDictionary class]]){
                [temp addObject:[NSString stringWithFormat:@"@property (nonatomic,strong) %@ *%@;//\n",[[value superclass] class],key]];
                [self recursionForResultWithObj:value];
            }else{
                if([value isKindOfClass:[NSString class]]){
                    [temp addObject:[NSString stringWithFormat:@"@property (nonatomic,copy) %@ *%@;//\n",[NSString class],key]];
                }else if([value isKindOfClass:[NSNumber class]]){
                    [temp addObject:[NSString stringWithFormat:@"@property (nonatomic,strong) %@ *%@;//\n",[NSNumber class],key]];
                }else{
                    [temp addObject:[NSString stringWithFormat:@"@property (nonatomic,strong) %@ *%@;//\n",@"id",key]];
                }
            }
            [self.temps addObject:temp];
        }
    }
}

@end

關(guān)于將mac程序打包生成dmg文件

這篇文章有介紹:Mac 軟件打包生成dmg文件

Json數(shù)據(jù)自動生成 Model 文件介紹就到此完畢底扳,后面有相關(guān)再補充,寫文章不容易贡耽,還請點個小星星傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衷模,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒲赂,更是在濱河造成了極大的恐慌阱冶,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凳宙,死亡現(xiàn)場離奇詭異熙揍,居然都是意外死亡,警方通過查閱死者的電腦和手機氏涩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門届囚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來有梆,“玉大人,你說我怎么就攤上這事意系∧嘁” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵蛔添,是天一觀的道長痰催。 經(jīng)常有香客問我,道長迎瞧,這世上最難降的妖魔是什么夸溶? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮凶硅,結(jié)果婚禮上缝裁,老公的妹妹穿的比我還像新娘。我一直安慰自己足绅,他們只是感情好捷绑,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氢妈,像睡著了一般粹污。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上首量,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天壮吩,我揣著相機與錄音,去河邊找鬼蕾总。 笑死粥航,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的生百。 我是一名探鬼主播递雀,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚀浆!你這毒婦竟也來了缀程?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤市俊,失蹤者是張志新(化名)和其女友劉穎杨凑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摆昧,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡撩满,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伺帘。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡昭躺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伪嫁,到底是詐尸還是另有隱情领炫,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布张咳,位于F島的核電站帝洪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脚猾。R本人自食惡果不足惜葱峡,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望龙助。 院中可真熱鬧族沃,春花似錦、人聲如沸泌参。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沽一。三九已至,卻和暖如春漓糙,著一層夾襖步出監(jiān)牢的瞬間铣缠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工昆禽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝗蛙,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓醉鳖,卻偏偏與公主長得像捡硅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盗棵,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350