文档章节

JSONModel库的使用方法

 泊竹
发布于 2015/06/26 16:02
字数 779
阅读 581
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

使用方法

1、基本类型/字符串/普通数组/字典/嵌套/可选

@interface  Test1Entity : JSONModel

@property (nonatomic, strong) NSString              *testString;
@property (nonatomic, assign) int                   testNumber;
@property (nonatomic, strong) NSArray<Optional>     *testArray;
@property (nonatomic, strong) NSDictionary          *testDictionary;
@property (nonatomic, strong) Test2Entity           *entity2;

@end

其中:

      Optional关键字表示testArray属性可以为空。当server端没有返回对应的数据时,忽略对它的解析。没有声明可选的属性,如果server端没有返回对应的数据,会引起crash。

      entity2是Test2Entity类型的属性,Test2Entity必须是JSONModel的子类。会自动嵌套解析直到全部遍历完。

调用:

Test1Entity *entity = [[Test1Entity alloc] initWithDictionary:@{@"testString"       :@"abc",
                                                                @"testNumber"       :@12,
                                                                @"testArray"        :@[@"1"],
                                                                @"testDictionary"   :@{@"key":@"value"},
                                                                @"entity2"          :@{@"testEnum":@2}
                                                                }
                                                        error:nil];
NSString *jsonString = [entity toJSONString];
NSDictionary *dict = [entity toDictionary];

其中:

      initWithDictionary:方法把传入的字典自动解析生成Entity。如果不特别设定,默认数据源的key和属性名相同。

      toJSONString方法把对象解析成JSONString,toDictionary方法把对象解析成字典。

2、枚举

typedef NS_ENUM(NSInteger, TestEnum) {
    TestENUM_1 = 0,
    TestENUM_2 = 1,
    TestENUM_3 = 2
};

@interface Test2Entity : JSONModel

@property (nonatomic, assign) TestEnum testEnum;

@end

调用:

Test2Entity *entity = [[Test2Entity alloc] initWithDictionary:@{@"testEnum":@2} error:nil];
NSString *jsonString = [entity toJSONString];

3、Guid

@interface Test3Entity : JSONModel

@property (nonatomic, strong) Guid *myId;

@end

调用:

Test3Entity *entity = [[Test3Entity alloc] initWithDictionary:@{@"myId":@"60165555201222841131397181021744"} error:nil];
NSString *jsonString = [entity toJSONString];

4、NSDate

@interface Test4Entity : JSONModel

@property (nonatomic, strong) NSDate    *myDate;

@end

调用:

Test4Entity *entity = [[Test4Entity alloc] initWithDictionary:@{@"myDate":@"2014-01-20 12:30:33"} error:nil];
NSString *jsonString = [entity toJSONString];

      对于NSDate属性的解析,已经自动做了本地时间和UTC时间的转换。当数据向对象转换,UTC - Local。当对象向数据转换,Local - UTC。

5、对象数组/延迟加载

      想要让一个数组内的对象自动解析,需要做一些特殊处理。

    1、需要在定义Entity的时候,定义一个与Entity同名的protocol。

    2、需要在定义数组属性时,声明这个protocol。

typedef NS_ENUM(NSInteger, TestEnum) {
    TestENUM_1 = 0,
    TestENUM_2 = 1,
    TestENUM_3 = 2
};

@protocol Test2Entity
@end

@interface Test2Entity : JSONModel

@property (nonatomic, assign) TestEnum testEnum;

@end
//--------------------------------------------------------------
@interface Test6Entity : JSONModel

@property (nonatomic, strong) NSArray<Optional, Test2Entity, ConvertOnDemand>  *entityArray;

@end

调用:

Test6Entity *entity = [[Test6Entity alloc] initWithDictionary:@{@"entityArray":@[@{@"testEnum":@2}, @{@"testEnum":@3}]} error:nil];
NSString *jsonString = [entity toJSONString];
NSDictionary *dict = [entity toDictionary];

6、server端返回数据的Key和Class的属性之间的对应关系设置

      默认情况下,会根据属性的名字去匹配返回数据的Key。如果类的属性名和返回数据的Key不相同,则需要通过手动指定来匹配。JSONModel库通过JSONKeyMapper类来记录这些对应关系。

      在JSONModel类中,有一个类方法+(JSONKeyMapper*)keyMapper;返回的JSONKeyMapper对象在JSONModel子类对象解析数据的时候被使用。

+(JSONKeyMapper *)keyMapper
{
    JSONKeyMapper *keyMapper = [[JSONKeyMapper alloc] initWithDictionary:@{@"ServerKey":@"ClassProperty"}];
    return keyMapper;
}

    每个JSONModel子类都这样弄会比较繁琐。当属性名和Key之间的对应关系是有一定规律时,可以使用JSONModel的另外几个类方法来快速设定。

1、Key首字母大写,属性名首字母小写

+(JSONKeyMapper *)keyMapper
{
    JSONKeyMapper *keyMapper = [JSONKeyMapper mapperFromUpperCaseToLowerCase];
    return keyMapper;
}

2、key首字母是下划线,后面和属性名相同

+(JSONKeyMapper *)keyMapper
{
    JSONKeyMapper *keyMapper = [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
    return keyMapper;
}


© 著作权归作者所有

粉丝 91
博文 67
码字总数 13285
作品 0
徐汇
私信 提问
加载中

评论(0)

关于JSONModel和MJExtension的性能对比

最初我在微博上看到MJExtension的发布的时候,声称它比其他JSONModel等其他Data model快上好多倍,当时我正在用JSONModel,感觉这个事情很神奇,但是一直没有去看看MJExtension具体是怎么做到...

贝勒老爷
2018/08/15
0
0
微信开发-ACCESS TOKEN 过期失效解决方案

微信开发-ACCESS TOKEN 过期失效解决方案 起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一天调用2000次。流量一高,就over了,...

仰天一笑
2015/04/13
0
0
iOS:JSON转OC属性小工具

iOS:JSON转OC属性小工具 在iOS开发中,只要有网络模块,就需要数据模型的编写。在进行数据模型的解析和映射时,JSONModel是一个非常常用且优秀的第三方框架,之前有有过博客对其分析,地址如...

珲少
2018/06/09
340
0
反射--> 解析JSON数据

方法一 Persons.json文件 [{"name": "Chris","age": 18,"city": "Shanghai","job": "iOS"},{"name": "Ada","age": 16,"city": "Beijing","job": "student"},{"nam...

osc_o18rkfva
2018/02/22
0
0
(20170207)开源第三方学习之JSONModel

1:仓库地址:https://github.com/jsonmodel/jsonmodel 主要作用是把JSON字符串转成Model实体,也可以把实体转化成JSON字符串;还包含一些转字典的内容;JOSN字符串通过AFNetworking转化成字...

踏浪帅
2017/02/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

websocket实现一个聊天室

上次讲了websoket的基础知识和应用插件,今天我们来用websocket来实现一个聊天程序。先看几张界面截图: 聊天界面: 历史消息查看: 用户上线提醒: 在线体验地址:地址 功能结构图 可以看到...

osc_k1o54uky
58分钟前
25
0
gvim的基本配置(中文乱码,行号和主题)

在C:\Program Files\Vim目录下的 _vimrc文件中,插入基本配置,包括中文乱码,行号和主题。 " Vim with all enhancementssource $VIMRUNTIME/vimrc_example.vim" 解决中文乱码set encodi......

osc_jcfo5qp3
59分钟前
15
0
cad版本转换器哪一款好用?DWG和DXF文件如何互转?

很多工作者在工作时发现,有时候自己接收到一个文件,点击打开时发现打不开,显示文件格式不对,遇见这样的情况就需要把文档转换成自己常用的文件格式。只有经过转换过的图才能打开查看,那么...

真不莲
今天
20
0
C++类中引用成员和常量成员的初始化(初始化列表)

如果一个类是这样定义的: Class A{ public: A(int pram1, int pram2, int pram3); privite: int a; int &b; const int c; } ......

osc_y9y4gqxx
今天
23
0
三年OI——我的初中信竞生涯

目录 前言 Part 1 Part 2 Part 3 Part 4 Part 5 Part 6 后记 前言 OI至今已三年,小记一则,兼怀往事 文采不加,文章不伦不类,愧对语文老师 Part 1 初一上学期时,家父听说\(xzy\)(学长)得...

osc_9fexqrfv
今天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部