JSONModel的基本介绍
JSONModel是json转model的第三方开源库。当我们向服务器发送一个请求之后,通过JSONModel把数据转成model中的属性就可以很方便的供给我们使用了。
JSONModel的安装
JSONModel的使用
基本使用
打开我们已经导入JSONModel库的项目,创建一个Model类。
#import "JSONModel.h"
@interface Model : JSONModel
@property (nonatomic, assign) int status;
@property (nonatomic, copy) NSString* msg;
@property (nonatomic, copy) NSString* latest;
@end
注意这里的msg不能擅自写成message,否则请求到的数据不能按照键-值对来匹配,就不能让我们的属性接收到请求来的信息
#import "ViewController.h"
#import "Model.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
NSString* json = @"http://news-at.zhihu.com/api/4/version/ios/2.3.0";
json = [json stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSURL* testURL = [NSURL URLWithString:json];
NSURLRequest* testRequest = [NSURLRequest requestWithURL:testURL];
NSURLSession* testSession = [NSURLSession sharedSession];
NSURLSessionDataTask* testDataTask = [testSession dataTaskWithRequest:testRequest completionHandler:^(NSData* _Nullable data, NSURLResponse* _Nullable response, NSError* _Nullable error) {
//以及自行创建好的类
Model* country = [[Model alloc]initWithData:data error:nil];
NSLog(@"%@", country);
}];
//任务启动
[testDataTask resume];
}
请求到的数据如下:
如果传过来的JSON合法,你所定义的所有的属性都会与该JSON的值想对应,甚至JSONModel会尝试去转换数据为你期望的类型 JSONValueTransformer类可以支持我们做许多转换 如下:
NSMutableString <-> NSString
NSMutableArray <-> NSArray
NS(Mutable)Array <- JSONModelArray
NSMutableDictionary <-> NSDictionary
NSSet <-> NSArray
BOOL <-> number/string
string <-> number
string <-> url
string <-> time zone
string <-> date
number <-> date
集合、嵌套类型数据:
应对集合、嵌套类型数据,我们可以在一个文件里写多个类,然后将类转为数组
在ModelA.h
@protocol StoriesModel
@end
@protocol Top_StoriesModel
@end
#import "JSONModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface ModelA : JSONModel
@property (nonatomic, copy) NSString *date;
//将另外两个类转为数组
@property (nonatomic, copy) NSArray<StoriesModel>* stories;
@property (nonatomic, copy) NSArray<Top_StoriesModel>* top_stories;
@end
@interface StoriesModel : JSONModel
@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* ga_prefix;
@property (nonatomic, copy) NSString* type;
@property (nonatomic, copy) NSString* image_hue;
@property (nonatomic, copy) NSString* id;
@end
@interface Top_StoriesModel : JSONModel
@property (nonatomic, copy) NSString* title;
@property (nonatomic, copy) NSString* ga_prefix;
@property (nonatomic, copy) NSString* type;
@property (nonatomic, copy) NSString* image_hue;
@property (nonatomic, copy) NSString* id;
@end
NS_ASSUME_NONNULL_END
#import "ModelA.h"
@implementation ModelA
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
return YES;
}
@end
@implementation Top_StoriesModel
+ (BOOL) propertyIsOptional:(NSString *)propertyName {
return YES;
}
@end
@implementation StoriesModel
+ (BOOL) propertyIsOptional:(NSString *)propertyName {
return YES;
}
@end
注意:
- 方法+(BOOL)propertyIsOptional:(NSString *)propertyName 的作用是不想因为服务器的某个值没有返回(nil)就使程序崩溃, 我们会加关键字Optional,如果不想每一条属性都添加,我们也可以在.m文件中重写方法 这个就是重写了方法
比如第一个API的msg如果版本已经最新了,那么msg就没有返回值 如果不写就会造成程序的崩溃
- iOS9引入了新特性:App Transport Security (ATS),新特性要求App内访问的网络必须使用HTTPS协议。
但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全。现在也不能马上改成HTTPS协议传输。
我们可以再声明一下需要的被嵌套的model,然后给其赋值,就可以直接调用了
@property (nonatomic, copy) StoriesModel * stories;
self->_stories = country.stories[0];
NSLog(@"%@", self->_stories.title);
+ (JSOMKeyMapper) keyMapper {
return [[JSON alloc] initwithModelToJSONDictionary:@{
@"ID":@"id",
@"imageStr":@"image"
}];
}
原文地址:https://blog.csdn.net/zdsey/article/details/127268583
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_44642.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。