IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【iOS】JSONModel及其使用 -> 正文阅读

[移动开发]【iOS】JSONModel及其使用

JSONModel的基本介绍

JSONModel是json转model的第三方开源库。当我们向服务器发送一个请求之后,通过JSONModel把数据转成model中的属性就可以很方便的供给我们使用了。

JSONModel的安装

方法同安装Masonry,具体详见

在这里再简单叙述一次:

  1. 打开终端, cd到文件目录(可将文件直接拖进去)
  2. 终端输入 touch PodFile创建新文件
  3. 打开PodFile文件并将其内容设为

platform:ios,‘9.0’
target ‘(文件名称)’ do
pod ‘JSONModel’
end

  1. 保存并关闭文件,终端输入pod install

等待安装完成。

JSONModel的使用

基本使用

给出一个接口,我们开始网络请求:

https://news-at.zhihu.com/api/4/news/latest

打开我们已经导入JSONModel库的项目,创建一个Model类。

  • 这个类是继承于JSONModel类的
  • 将请求的JSON数据在Model.h中声明为属性
#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

在Model A.m中完成类的实现

#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协议传输。

解决方法就是在info中添加方法:
在这里插入图片描述

  • 获取镶嵌数组中的元素

直接用点语法会报错:
在这里插入图片描述

我们可以再声明一下需要的被嵌套的model,然后给其赋值,就可以直接调用了

@property (nonatomic, copy) StoriesModel * stories;
self->_stories = country.stories[0];
NSLog(@"%@", self->_stories.title);
  • key设置全局键映射(应用于所有Model)实现于.m文件,用于给变量换名字
+ (JSOMKeyMapper) keyMapper {
	return [[JSON alloc] initwithModelToJSONDictionary:@{
														@"ID":@"id",
														@"imageStr":@"image"
														}];
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:46:08  更:2022-10-17 12:48:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:34:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码