Json自动解析生成Model工具

3,147 阅读2分钟

背景

平常开发一个头疼的事情是,接口返回的json数据转成model数据,需要重复做这些无聊的工作,比较浪费时间。如果能一键生成对应的数据类那该多好?于是找到了一个办法来解决:

官方禁止Xcode8使用插件,所以以前的插件实现不能用了。目前找到一个运行在Mac上的工具可以实现这个功能[ESJsonFormat]切记每次转完之后需要自查

软件功能:

  • 具有ESJsonFormat的Json转模型功能;
  • 支持OC/Swift语言切换;
  • 支持MJExtension和YYModel两种转换方式;
  • 转换Json中id字段为ID(规避关键字id,生成后可把ID改成自定义的名称);
  • 脱离Xcode环境,直接运行在Mac电脑;
  • 可以直接在Json输入框中输入Json字段,点击Enter开始模型转换;同时支持网络请求,支持Post/Get方式进行网络请求,然后直接对请求结果进行转换;
  • 直接输出自定义名称的.h和.m文件或者.swift文件;

具体操作的详情:

  • 下载完项目后,直接使用Xcode打开运行,可以看到如下界面功能

截屏2021-11-04 下午2.46.38.png

  • 粘贴json数据,选择对应选项,点击start开始生成文件

截屏2021-11-04 下午2.59.04.png

  • 生成了对应的.h和.m文件

截屏2021-11-04 下午2.59.37.png

  • 打开生成的文件,检查下是否有异常

截屏2021-11-04 下午3.00.20.png

截屏2021-11-05 上午8.56.17.png

  • 选择通过MJExtension进行转换,可以看到生成了属性值变化的替换方法,数组对应模型的方法

截屏2021-11-04 下午3.03.23.png

截屏2021-11-04 下午3.05.14.png

截屏2021-11-04 下午3.06.01.png

  • 选择Swift语言,也可以生成对应的代码

截屏2021-11-04 下午3.06.34.png

存在的问题:

整体使用还是很方便的,解决了自己重复定义那些model属性的问题。但是体验下发现有两个地方的问题:

选择Swift语言生成的类有问题,声明类使用了@interface,Swift声明类应该用class

选择MJExtension进行转换,发现id转换没有生成替换属性名称的方法

所以需要将下载的代码做如下修改:

  • 找到ESJsonFormatManager类,用下面代码替换parseClassContentForSwiftWithClassInfo这个方法
+ (NSString *)parseClassContentForSwiftWithClassInfo:(ESClassInfo *)classInfo{

    NSString *superClassString = [[NSUserDefaults standardUserDefaults] valueForKey:@"SuperClass"];
    NSMutableString *result = nil;
    if (superClassString&&superClassString.length>0) {
        result = [NSMutableString stringWithFormat:@"\n class %@ : %@{\n",classInfo.className,superClassString];
    } else {
        result = [NSMutableString stringWithFormat:@"\n class %@ : NSObject {\n",classInfo.className];
    }

    [result appendString:classInfo.propertyContent];
    [result appendString:@"\n}"];

    if ([ESJsonFormatSetting defaultSetting].outputToFiles) {
        [result insertString:@"import UIKit\n\n" atIndex:0];
        //headerStr
        NSMutableString *headerString = [NSMutableString stringWithString:[self dealHeaderStrWithClassInfo:classInfo type:@"swift"]];
        [result insertString:headerString atIndex:0];
    }

    return [result copy];
}
  • 找到ESJsonFormatManager类,用下面代码替换methodContentOfObjectIDInArrayWithClassInfo这个方法
+ (NSString *)methodContentOfObjectIDInArrayWithClassInfo:(ESClassInfo *)classInfo{

        NSMutableString *result = [NSMutableString string];
        NSDictionary *dic = classInfo.classDic;
         NSLog(@"%@",dic);
        [dic enumerateKeysAndObjectsUsingBlock:^(id key, NSObject *obj, BOOL stop) {
            NSLog(@"key====%@",key);
            NSLog(@"obj====%@",obj);
            NSLog(@"=============================");
            
            if ([ESUppercaseKeyWords containsObject:key] && [ESJsonFormatSetting defaultSetting].uppercaseKeyWordForId) {
                [result appendFormat:@"@\"%@\":@\"%@\", ",[key uppercaseString],key]; 
            }
        }];
        
        if ([result hasSuffix:@", "]) {
            result = [NSMutableString stringWithFormat:@"%@",[result substringToIndex:result.length-2]];
            NSString *methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary<NSString *,id> *)modelCustomPropertyMapper{\n    return @{%@};\n}\n",result];
            BOOL isYYModel = [[NSUserDefaults standardUserDefaults] boolForKey:@"isYYModel"];
            if (!isYYModel) {
                methodStr = [NSString stringWithFormat:@"\n+ (NSDictionary *)mj_replacedKeyFromPropertyName{\n    return @{%@};\n}\n",result];
            }
            return methodStr;
        }
        return result;

}

非常感谢:此工具来自[ESJsonFormat]