觉得有用麻烦给个喜欢,谢谢各位亲😁
我们在开发的项目的时候,需要很多model来存储数据,通常JSONModel使用的比较多,现在就来简单介绍一下JSONModel的使用。
首先配上在网络请求中模型转化的代码:
FirstModel *result = [[FirstModel alloc] initWithDictionary:responseDic error:&error];
注意一:<一定要加这个方法呀,不然解析不出来,我都被坑了N次了,最好建个ji lei>
后台传过来的参数,有时候是空值,是null,此时JSONModel在解析的时候会出现崩溃的现象,此时我们可以在.m文件中加入一个类方法:
//这个方法是把所有的属性全部设置为可选值,这样就算后台传过来的值是空值,也没有关系
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
return YES;
}
注意二:在末尾
如果后台传过来的数据是这种形式的:
{
content = "\U8f85\U5bfc\U5458\U6307\U5bfc\U6821\U56ed\U5c0f\U8bb0\U8005\U3001\U5c0f\U64ad\U97f3\U5458\U5728\U6821\U56ed\U5e7f\U64ad\U7ad9\n\U91c7\U7f16\U64ad\U4f18\U79c0\U513f\U7ae5\U8d44\U6e90\U5185\U5bb9\U3002";
status = 1;
title = "\U5c11\U5148\U961f\U5458\U4e3b\U64ad";
}
这是最简单的一种数据形式,我们只需要建立一个Object-C类,继承自JSONModel,在.h里面写上和这两个对应的属性就好了,代码如下:
#import "JSONModel.h"
@interface FirstModel : JSONModel
@property (assign, nonatomic) int status;
@property (strong, nonatomic) NSString* title;
@property (strong, nonatomic) NSString* content;
@end
这种情况下,.m不需要做任何操作,但是,如果后台闯过来的参数比较复杂,我们想自己定义自己习惯的属性来使用,那么我们可以在.m文件中进行Key映射,例子上:
若后台传过来的数据的名字是这种形式的
{
user_name_type = "\U6210\U529f";
succeed = 1;
}
我们在FirstModel的.h中的代码为:
#import "JSONModel.h"
@interface FirstModel : JSONModel
@property (assign, nonatomic) BOOL succeed;
@property (strong, nonatomic) NSString* type;
@end
我们在.m文件中的代码为
@implementation OrderModel
+(JSONKeyMapper*)keyMapper
{
return [[JSONKeyMapper alloc] initWithDictionary:@{
@"user_name_type": @"type"
}];
}
@end
模型嵌套:
{
msg = "\U6210\U529f";
succeed = 1;
data =
{
content = "\U8f85\U5bfc\U5458\U6307\U5bfc\U6821\U56ed\U5c0f\U8bb0\U8005\U3001\U5c0f\U64ad\U97f3\U5458\U5728\U6821\U56ed\U5e7f\U64ad\U7ad9\n\U91c7\U7f16\U64ad\U4f18\U79c0\U513f\U7ae5\U8d44\U6e90\U5185\U5bb9\U3002";
status = 1;
title = "\U5c11\U5148\U961f\U5458\U4e3b\U64ad";
};
}
此时我们需要创建两个继承自JSONModel的model类,在.h中实现如下代码:
@interface SecondModel : JSONModel
@property (assign, nonatomic) BOOL succeed;
@property (strong, nonatomic) NSString* msg;
@property (strong, nonatomic) FirstModel* firstModel;
@end
模型集合:
{
msg = "\U6210\U529f";
succeed = 1;
data = (
{
content = "\U8f85\U5bfc\U5458\U6307\U5bfc\U6821\U56ed\U5c0f\U8bb0\U8005\U3001\U5c0f\U64ad\U97f3\U5458\U5728\U6821\U56ed\U5e7f\U64ad\U7ad9\n\U91c7\U7f16\U64ad\U4f18\U79c0\U513f\U7ae5\U8d44\U6e90\U5185\U5bb9\U3002";
status = 1;
title = "\U5c11\U5148\U961f\U5458\U4e3b\U64ad";
},
{
content = "\U8f85\U5bfc\U5458\U6307\U5bfc\U6821\U56ed\U5c0f\U8bb0\U8005\U3001\U5c0f\U64ad\U97f3\U5458\U5728\U6821\U56ed\U5e7f\U64ad\U7ad9\n\U91c7\U7f16\U64ad\U4f18\U79c0\U513f\U7ae5\U8d44\U6e90\U5185\U5bb9\U3002";
status = 1;
title = "\U5c11\U5148\U961f\U5458\U4e3b\U64ad";
}
);
}
创建两个继承自JSONModel的model类,在.h中实现如下代码:
@protocol ThirdModel
@end
@interface ThirdModel : JSONModel
@property (assign, nonatomic) BOOL succeed;
@property (strong, nonatomic) NSString* msg;
@property (strong, nonatomic) NSArray<FirstModel *>* firstModels;
@end
模型嵌套+模型集合(⚠️此处有坑)
{
msg = "\U6210\U529f";
succeed = 1;
data = {
childList = (
{
content = "\U8f85\U5bfc\U5458\U6307\U5bfc\U6821\U56ed\U5c0f\U8bb0\U8005\U3001\U5c0f\U64ad\U97f3\U5458\U5728\U6821\U56ed\U5e7f\U64ad\U7ad9\n\U91c7\U7f16\U64ad\U4f18\U79c0\U513f\U7ae5\U8d44\U6e90\U5185\U5bb9\U3002";
status = 1;
title = "\U5c11\U5148\U961f\U5458\U4e3b\U64ad";
},
{
content = "\U8f85\U5bfc\U5458\U6307\U5bfc\U6821\U56ed\U5c0f\U8bb0\U8005\U3001\U5c0f\U64ad\U97f3\U5458\U5728\U6821\U56ed\U5e7f\U64ad\U7ad9\n\U91c7\U7f16\U64ad\U4f18\U79c0\U513f\U7ae5\U8d44\U6e90\U5185\U5bb9\U3002";
status = 1;
title = "\U5c11\U5148\U961f\U5458\U4e3b\U64ad";
}
);
otherChildList= (
{
content = "\U8f85\U5bfc\U5458\U6307\U5bfc\U6821\U56ed\U5c0f\U8bb0\U8005\U3001\U5c0f\U64ad\U97f3\U5458\U5728\U6821\U56ed\U5e7f\U64ad\U7ad9\n\U91c7\U7f16\U64ad\U4f18\U79c0\U513f\U7ae5\U8d44\U6e90\U5185\U5bb9\U3002";
status = 1;
title = "\U5c11\U5148\U961f\U5458\U4e3b\U64ad";
},
{
content = "\U8f85\U5bfc\U5458\U6307\U5bfc\U6821\U56ed\U5c0f\U8bb0\U8005\U3001\U5c0f\U64ad\U97f3\U5458\U5728\U6821\U56ed\U5e7f\U64ad\U7ad9\n\U91c7\U7f16\U64ad\U4f18\U79c0\U513f\U7ae5\U8d44\U6e90\U5185\U5bb9\U3002";
status = 1;
title = "\U5c11\U5148\U961f\U5458\U4e3b\U64ad";
}
);
};
}
这个模型比较复杂,字典里面套字典,字典中又套用了数组,数组中又是字典,所以我们需要把逻辑整理清楚,首先我们需要新建两个继承自JSONModel的model类分别为ForthModel和FiveModel,在ForthModel的.h中作如下操作:
@interface ForthModel : JSONModel
@property (strong, nonatomic) NSArray< FirstModel *>* otherChildList;
@property (strong, nonatomic) NSArray< FirstModel *>* childList;
@end
同时,我们需要在.m文件中做一个操作,不然解析不出来,代码如下:
+ (NSString *)protocolForArrayProperty:(NSString *)propertyName {
if ([propertyName isEqualToString:@"childList"]) {
return NSStringFromClass([FirstModel class]);
}
if ([propertyName isEqualToString:@"otherChildList"]) {
return NSStringFromClass([FirstModel class]);
}
return NSStringFromClass([NSDictionary class]);
}
ForthModel中代码实现之后,实现FiveModel中的代码,在.h中做如下操作
@interface FiveModel : JSONModel
@property (assign, nonatomic) BOOL succeed;
@property (strong, nonatomic) NSString* msg;
@property (strong, nonatomic) ForthModel* data;
@end
同时,我们需要在FiveModel的.m文件中做一个操作,不然依然解析不出来,代码如下:
+ (NSString *)protocolForArrayProperty:(NSString *)propertyName {
if ([propertyName isEqualToString:@"data"]) {
return NSStringFromClass([ForthModel class]);
}
return NSStringFromClass([NSDictionary class]);
}
注意:一定要在.m文件中加入这个判断,不然解析失败。
此时,模型嵌套和模型集合就解析成功。