欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

[iOS開(kāi)發(fā)]JSONModel的使用 - 新聞資訊 - 云南小程序開(kāi)發(fā)|云南軟件開(kāi)發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開(kāi)發(fā)/軟件開(kāi)發(fā)

知識(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í)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 技術(shù)分享 >

[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)的步驟就是:

  1. 創(chuàng)建一個(gè)Model的類,這個(gè)類是繼承自JSONModel的
  2. 將請(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
  1. 使用網(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)

  1. +(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ì)造成程序的崩潰

  2. 在剛開(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中添加如下
在這里插入圖片描述

  1. 怎么樣可以獲取鑲嵌數(shù)組中的元素呢
    可以看到點(diǎn)語(yǔ)法是行不通的 由于是model嵌套model所以不能直接調(diào)用 在這里插入圖片描述

我們可以再聲明一下需要的被嵌套的model,然后給其賦值,就可以直接調(diào)用了。
在這里插入圖片描述
在這里插入圖片描述

  1. key設(shè)置全局鍵映射(應(yīng)用于所有model)
    在.m文件中實(shí)現(xiàn) 作用是給變量換名字
    換名:
    在這里插入圖片描述

  2. 自動(dòng)把下劃線方式的命名轉(zhuǎn)為駝峰命名屬性。還有類似的,如大寫轉(zhuǎn)為小寫的方法:mapperFromUpperCaseToLowerCase

在這里插入圖片描述

相關(guān)案例查看更多