知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
[iOS開(kāi)發(fā)]JSONModel的使用
發(fā)表時(shí)間:2020-10-18
發(fā)布人:葵宇科技
瀏覽次數(shù):61
一、什么是JSONModel?
JSONModel是json轉(zhuǎn)model的第三方開(kāi)源庫(kù)。當(dāng)我們向服務(wù)器發(fā)送一個(gè)請(qǐng)求之后,通過(guò)JSONModel把數(shù)據(jù)轉(zhuǎn)成model中的屬性就可以很方便的供給我們使用了。
二、JSONModel的最基本使用方法
以最簡(jiǎn)單的一個(gè)知乎版本檢查API請(qǐng)求到的json數(shù)據(jù)為例
發(fā)送的版本為2.3版本 那么此時(shí)的json數(shù)據(jù)為
這個(gè)就是我們發(fā)送網(wǎng)絡(luò)請(qǐng)求得到的json數(shù)據(jù)
我們接下來(lái)的步驟就是:
- 創(chuàng)建一個(gè)Model的類,這個(gè)類是繼承自JSONModel的
- 將請(qǐng)求到的json的數(shù)據(jù)在.h文件中聲明為屬性,.m文件中暫時(shí)不需要做其他事情(如果涉及到嵌套會(huì)有其他的)
#import "JSONModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface TestModel : JSONModel
@property (nonatomic, assign) int status;
@property (nonatomic, copy) NSString* msg;
@property (nonatomic, copy) NSString* latest;
@end
NS_ASSUME_NONNULL_END
- 使用網(wǎng)絡(luò)請(qǐng)求到的數(shù)據(jù)將model初始化
- (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) {
//這個(gè)TestModel就是上面說(shuō)到的類
TestModel* country = [[TestModel alloc] initWithData:data error:nil];
NSLog(@"%@",country);
}];
//任務(wù)啟動(dòng)
[testDataTask resume];
}
如果傳過(guò)來(lái)的JSON合法,你所定義的所有的屬性都會(huì)與該JSON的值想對(duì)應(yīng),甚至JSONModel會(huì)嘗試去轉(zhuǎn)換數(shù)據(jù)為你期望的類型 JSONValueTransformer類可以支持我們做許多轉(zhuǎn)換 如下:
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
此時(shí)我們就可以看到輸出了
三、集合、嵌套型數(shù)據(jù)
還是知乎API的一個(gè)請(qǐng)求
這次的數(shù)據(jù)很復(fù)雜他有嵌套, 有數(shù)組,我們應(yīng)該怎樣處理這種嵌套模型呢?我們應(yīng)該對(duì)每一個(gè)要嵌套的都寫成一個(gè)類,但并不是意味著要寫成多個(gè)類文件,而是只需要在一個(gè)類文件里把該有的寫好就行 如下代碼:
//
// TestModel.h
// JSONModel
//
// Created by young_jerry>//
@protocol StoriesModel
@end
@protocol Top_StoriesModel
@end
#import "JSONModel.h"
NS_ASSUME_NONNULL_BEGIN
@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
@interface TestModel : JSONModel
@property (nonatomic, copy) NSString *date;
@property (nonatomic, copy) NSArray<StoriesModel>* stories;
@property (nonatomic, copy) NSArray<Top_StoriesModel>* top_stories;
//
//@property (nonatomic, assign) int status;
//@property (nonatomic, copy) NSString *msg;
//@property (nonatomic, copy) NSString *latest;
@end
NS_ASSUME_NONNULL_END
在.m文件中我們則要完成類的實(shí)現(xiàn),不然會(huì)報(bào)錯(cuò)
#import "TestModel.h"
@implementation Top_StoriesModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
return YES;
}
@end
@implementation StoriesModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
return YES;
}
@end
@implementation TestModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName {
return YES;
}
@end
我們?cè)诰W(wǎng)絡(luò)請(qǐng)求賦值結(jié)束后打印一下第一組top_stories的值,可以看見(jiàn)已經(jīng)獲取成功了
四、注意的幾點(diǎn)
-
+(BOOL)propertyIsOptional:(NSString *)propertyName 作用是不想因?yàn)榉?wù)器的某個(gè)值沒(méi)有返回(nil)就使程序崩潰, 我們會(huì)加關(guān)鍵字Optional,如果不想每一條屬性都添加,我們也可以在.m文件中重寫方法 這個(gè)就是重寫了方法
比如第一個(gè)API的msg如果版本已經(jīng)最新了,那么msg就沒(méi)有返回值 如果不寫就會(huì)造成程序的崩潰 -
在剛開(kāi)始寫demo時(shí),所有的正確,但是網(wǎng)絡(luò)請(qǐng)求就是失敗
查詢到以下信息:
iOS9引入了新特性:App Transport Security (ATS),新特性要求App內(nèi)訪問(wèn)的網(wǎng)絡(luò)必須使用HTTPS協(xié)議。
但是現(xiàn)在公司的項(xiàng)目使用的是HTTP協(xié)議,使用私有加密方式保證數(shù)據(jù)安全。現(xiàn)在也不能馬上改成HTTPS協(xié)議傳輸。
最終找到以下解決辦法:
在Info中添加如下
- 怎么樣可以獲取鑲嵌數(shù)組中的元素呢
可以看到點(diǎn)語(yǔ)法是行不通的 由于是model嵌套model所以不能直接調(diào)用
我們可以再聲明一下需要的被嵌套的model,然后給其賦值,就可以直接調(diào)用了。
-
key設(shè)置全局鍵映射(應(yīng)用于所有model)
在.m文件中實(shí)現(xiàn) 作用是給變量換名字
換名:
-
自動(dòng)把下劃線方式的命名轉(zhuǎn)為駝峰命名屬性。還有類似的,如大寫轉(zhuǎn)為小寫的方法:mapperFromUpperCaseToLowerCase
相關(guān)案例查看更多
相關(guān)閱讀
- 前端
- 迪慶小程序開(kāi)發(fā)
- 云南網(wǎng)站建設(shè)專業(yè)品牌
- 北京小程序制作
- 網(wǎng)站建設(shè)電話
- 排名
- 小程序開(kāi)發(fā)排名前十名
- 軟件定制
- 昆明網(wǎng)站建設(shè)公司
- web前端
- 保險(xiǎn)網(wǎng)站建設(shè)公司
- 公眾號(hào)模板消息
- 昆明網(wǎng)絡(luò)公司
- 報(bào)廢車拆解軟件
- 云南小程序開(kāi)發(fā)報(bào)價(jià)
- 小程序開(kāi)發(fā)費(fèi)用
- 網(wǎng)絡(luò)公司排名
- 安家微信小程序
- 報(bào)廢車回收管理軟件
- 云南網(wǎng)站建設(shè)公司
- .net網(wǎng)站
- 昆明小程序開(kāi)發(fā)
- 云南網(wǎng)站建設(shè)公司地址
- 小程序表單
- 小程序
- 小程序的開(kāi)發(fā)公司
- 表單
- 旅游網(wǎng)站建設(shè)
- 云南網(wǎng)站建設(shè)靠譜公司
- 網(wǎng)站建設(shè)列表網(wǎng)