JSONModel简单使用and注意事项

觉得有用麻烦给个喜欢,谢谢各位亲😁

我们在开发的项目的时候,需要很多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文件中加入这个判断,不然解析失败。

此时,模型嵌套和模型集合就解析成功。

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

推荐阅读更多精彩内容