背景
平常开发一个头疼的事情是,接口返回的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打开运行,可以看到如下界面功能
- 粘贴json数据,选择对应选项,点击start开始生成文件
- 生成了对应的.h和.m文件
- 打开生成的文件,检查下是否有异常
- 选择通过MJExtension进行转换,可以看到生成了属性值变化的替换方法,数组对应模型的方法
- 选择Swift语言,也可以生成对应的代码
存在的问题:
整体使用还是很方便的,解决了自己重复定义那些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]