【iOS】json数据解析以及简单的网络数据请求

文章目录

  • 前言
  • 一、json数据解析
  • 二、简单的网络数据请求
  • 三、实现访问API得到网络数据
  • 总结


前言

近期写完了暑假最后一个任务——天气预报,在里面用到了简单的网络数据请求以及json数据的解析,特此记录博客总结

一、json数据解析

JSON是一种轻量级的数据格式,一般用于数据交互。目前JSON的使用非常广泛,绝大多数网络请求都采用了JSON格式。
举个例子:

{"code": "200","updateTime": "2021-11-15T16:35+08:00","fxLink": "http://hfx.link/2ax1","daily": [{"fxDate": "2021-11-15","sunrise": "06:58","sunset": "16:59","moonrise": "15:16","moonset": "03:40","moonPhase": "盈凸月","moonPhaseIcon": "803","tempMax": "12","tempMin": "-1","iconDay": "101","textDay": "多云","iconNight": "150","textNight": "晴",},{"fxDate": "2021-11-16","sunrise": "07:00","sunset": "16:58","moonrise": "15:38","moonset": "04:40","moonPhase": "盈凸月","moonPhaseIcon": "803","tempMax": "13","tempMin": "0","iconDay": "100","textDay": "晴","iconNight": "101","textNight": "多云",}],"refer": {"sources": ["QWeather","NMC","ECMWF"],"license": ["QWeather Developers License"]}
}

这就是我们利用API请求到的json数据,接下来我们对其进行解释


JSON的格式很像Objective-C中的字典和数组,标准JSON格式key必须用双引号包裹起来。像上述数据中的code,updateTime都是字典中的key。我们用一张图来解释我们的json数据:
在这里插入图片描述
例如在上面的json数据中,daily就相当于我们的NSArray,数组中的每一个元素的类型都是NSDictionary(字典)
搞清楚json数据中每个数据的类型后,我们就要去得到对应的数据,具体怎么得到将会在下文讲解完简单的网络数据请求后一并解释,在此我们只需要知道json数据在OC中对应的数据类型即可

二、简单的网络数据请求

在学习网络数据请求之前,我们有必要先了解两个概念:URL和API

API(应用程序编程接口)和URL(统一资源定位器)之间有密切的关系,但它们代表了不同的概念。

URL是用于定位资源在网络上的地址,它描述了资源的位置和访问方式。在Web中,URL通常用于标识和定位网页、图片、视频或其他文件。一个标准的URL通常由协议(例如HTTP或HTTPS)、主机名(例如www.example.com)、可选的端口号、文件路径和查询参数组成。例如:https://www.example.com/api/get_data。

API是一组规定的规则和协议,用于不同软件应用程序之间的通信和交互。API定义了应用程序如何请求和交换信息。在Web开发中,API通常以URL的形式提供,通过HTTP请求发送给服务器,并以JSON或XML等格式返回数据。API允许开发人员访问远程服务的功能或数据,而不需要了解底层的实现细节。

因此,URL可以被视为API的一部分。URL是实现访问API的重要组成部分,它是指向API的网络地址,用于标识和定位API的特定功能和资源。通过构建和发送HTTP请求到API的URL,可以实现与API的交互,请求数据或执行操作。

API一般是通过URL的形式进行访问,API相当于一种接口,而URL则是我们访问相应API所必须的参数


接下来笔者简单讲解一下iOS进行简单的网络数据请求的六步

  1. 创建API的URL:构建API的URL,包括指定基本地址、路径和查询参数等。
  2. 创建一个NSURL对象:使用URL字符串来创建NSURL对象,以便在请求中使用。
  3. 创建NSURLRequest:使用NSURL对象创建一个NSURLRequest对象,该对象将包含请求的类型(GET、POST等)和其他必要的信息。
  4. 创建NSURLSession:初始化NSURLSession来管理网络会话,它是发送请求的主要组件。
  5. 创建NSURLSessionDataTask:使用NSURLSession创建一个NSURLSessionDataTask对象,用于发送网络请求,并在请求完成后接收数据。
  6. 处理请求结果:在请求完成后,处理服务器返回的数据并进行相应的处理,例如解析数据或更新UI。
// 引入头文件
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 1. 创建API的URLNSString *urlString = @"https://api.example.com/data"; // 请替换为实际的API地址// 2. 创建NSURL对象NSURL *url = [NSURL URLWithString:urlString];// 3. 创建NSURLRequestNSURLRequest *request = [NSURLRequest requestWithURL:url];// 4. 创建NSURLSessionNSURLSession *session = [NSURLSession sharedSession];// 5. 创建NSURLSessionDataTaskNSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {if (error) {// 处理请求出错NSLog(@"Error: %@", error.localizedDescription);} else {// 6. 处理请求结果(这里简单地将返回的数据转为字符串并输出)NSString *responseData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"Response: %@", responseData);// 如果需要解析JSON数据,可以使用NSJSONSerialization类进行解析// NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];}}];// 7. 启动数据任务[dataTask resume];
}@end

需要注意的是这里只是最简单的GET请求,后续还会有POST请求等知识,笔者以后学到再进行补充


同时我们注意我们的第四步的方法也可以用
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue;这个方法来实现,其与[NSURLSession sharedSession]方法的区别在于后者只能用于简单的网络请求,而前者可以允许您使用自定义配置来创建会话,并且可以设置代理来处理相关事件

假设我们的API需要进行HTTP基本认证(Basic Authentication),我们需要在请求中包含用户名和密码。在这种情况下,我们可以在 NSURLSessionDelegate 中实现URLSession:task:didReceiveChallenge:completionHandler: 方法来处理认证。

#import "ViewController.h"@interface ViewController () <NSURLSessionDelegate>@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 1. 创建API的URLNSString *urlString = @"https://api.example.com/data"; // 请替换为实际的API地址// 2. 创建NSURL对象NSURL *url = [NSURL URLWithString:urlString];// 3. 创建NSURLSessionConfigurationNSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];// 4. 创建NSURLSession并设置代理NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];// 5. 创建NSURLSessionDataTaskNSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {if (error) {// 处理请求出错NSLog(@"Error: %@", error.localizedDescription);} else {// 处理请求结果(这里简单地将返回的数据转为字符串并输出)NSString *responseData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"Response: %@", responseData);}}];// 6. 启动数据任务[dataTask resume];
}#pragma mark - NSURLSessionDelegate- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler {// 这里我们处理HTTP基本认证(Basic Authentication)if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic]) {// 在这里设置您的用户名和密码NSString *username = @"your_username";NSString *password = @"your_password";// 创建NSURLCredential对象NSURLCredential *credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession];// 调用完成处理程序,将凭据传递给会话completionHandler(NSURLSessionAuthChallengeUseCredential, credential);}
}@end

同样的,在第五步中,我们同样可以使用两种方法来进行我们的数据请求
在这里插入图片描述

dataTaskWithRequest:completionHandler: 方法需要您自己创建和配置一个 NSURLRequest 对象,然后将其作为参数传递给该方法,以实现更多自定义和配置的选项。
dataTaskWithURL:completionHandler: 方法更为简洁,只需要传递一个 NSURL 对象,即请求的目标URL,而不需要自己创建和配置 NSURLRequest 对象。这个方法是发送GET请求的快捷方式,适用于简单的数据获取

但是在实际代码中我们更推荐使用第一种方法进行请求,因为我们的POST与GET一般结合在一起使用,也许GET方法可以不用到Request,但是POST方法一定会用到,这里的讲解等后面学到了具体写博客进行讲解,这里给出POST的栗子:

- (void)sendPOSTRequest {// 1. 创建API的URLNSString *urlString = @"https://api.example.com/post_endpoint"; // 请替换为实际的POST请求的URL// 2. 创建NSURL对象NSURL *url = [NSURL URLWithString:urlString];// 3. 创建NSMutableURLRequest对象,并设置HTTP方法为POSTNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];[request setHTTPMethod:@"POST"];// 4. 如果有需要,设置HTTP请求头,例如Content-Type等[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];// 5. 如果有参数或需要发送数据,可以将其添加到HTTP请求体中NSDictionary *parameters = @{@"key1": @"value1", @"key2": @"value2"};NSError *error;NSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error];if (!error) {[request setHTTPBody:postData];} else {NSLog(@"Error creating POST data: %@", error.localizedDescription);return;}// 6. 创建NSURLSession,并发送POST请求NSURLSession *session = [NSURLSession sharedSession];NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {if (error) {// 处理请求出错NSLog(@"Error: %@", error.localizedDescription);} else {// 处理请求结果NSString *responseData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"Response: %@", responseData);}}];// 7. 启动数据任务[dataTask resume];
}

三、实现访问API得到网络数据

讲解完我们的基本的网络数据请求的步骤,我们以我们上面的以我们上面的json数据为例来进行一个简单的网络数据请求:

{"code": "200","updateTime": "2021-11-15T16:35+08:00","fxLink": "http://hfx.link/2ax1","daily": [{"fxDate": "2021-11-15","sunrise": "06:58","sunset": "16:59","moonrise": "15:16","moonset": "03:40","moonPhase": "盈凸月","moonPhaseIcon": "803","tempMax": "12","tempMin": "-1","iconDay": "101","textDay": "多云","iconNight": "150","textNight": "晴",},{"fxDate": "2021-11-16","sunrise": "07:00","sunset": "16:58","moonrise": "15:38","moonset": "04:40","moonPhase": "盈凸月","moonPhaseIcon": "803","tempMax": "13","tempMin": "0","iconDay": "100","textDay": "晴","iconNight": "101","textNight": "多云",}],"refer": {"sources": ["QWeather","NMC","ECMWF"],"license": ["QWeather Developers License"]}
}

例如我们想要的到json数据中的fxDate,首先我们需要使用
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
将我们的访问API得到的二进制数据 data 解析为 NSDictionary 对象(或 NSArray 对象)。根据上面的知识我们可以知道我们需要将其解析为NSDictionary。于是我们使用如下代码先来解析我们的整个json数据
NSDictionary *weatherData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

然后我们可以知道我们字典中对应的“daily”键的类型实际上是一个NSArray对象,我们要想得到fxDate,首先需要访问daily,于是我们用如下代码得到daily NSArray *dailyArray = weatherData[@"daily"];

由于我们的daily数组中的每个对象类型都NSDictionary,于是我们可以使用如下代码得到我们数组中所有的fxDate

for (NSDictionary *currentDayData in dailyArray) {  NSString *timeString = currentDayData[@"fxDate"]; // 时间NSLog(@"%@", timeString);
}

得到我们如下的结果:
在这里插入图片描述
给出完整代码供大家参考:

    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {if (error) {// 请求出错处理} else {NSDictionary *weatherData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];if (error) {// 解析数据出错处理} else {// 解析数据成功NSArray *dailyArray = weatherData[@"daily"];for (NSDictionary *currentDayData in dailyArray) {NSString *timeString = currentDayData[@"fxDate"]; // 时间NSLog(@"%@", timeString);}NSLog(@"无法获取当前时间的天气数据。");}}}}];

总结

笔者在这里简单了讲解了一下基本的网络数据请求,实际上随着iOS的发展出现了许多第三方库例如JSONModel等,可以让我们更加方便的解析json以及请求网络数据,另外还有网络数据请求的POST用法笔者还不甚了解,后面学到会一并总结

json数据来源:
和风每日天气

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/55490.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg常见命令行(二):FFmpeg转封装

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;如何使…

基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章

今次介绍一个应用程序单例唯一运行方案的代码。 我们知道&#xff0c;有些应用程序在操作系统中需要单例唯一运行&#xff0c;因为程序多开的话会对程序运行效果有影响&#xff0c;最基本的例子就是打印机&#xff0c;只能运行一个实例。这里将笔者单例运行的代码共享出来&…

【频率派和贝叶斯派】进阶学习-贝叶斯方法原理、基本结构、代码构建+图模型

文章目录 前言1.理论支撑贝叶斯思考模式贝叶斯定理贝叶斯公式 2. 应用转化2.1 拼写检查 3. 贝叶斯网络3.1 贝叶斯网络的定义3.2 三个形式和实际案例的构建关系 前言 频率派与贝叶斯派各自不同的思考方式&#xff1a; 1.频率派把需要推断的参数θ看做是固定的未知数&#xff0c…

Ubuntu安装git

使用 apt-get install git 安装git 报错&#xff1a; 这个错误信息通常表示您的系统上没有可用的 git 软件包。这可能是因为您的软件源列表中没有包含 git 软件包所在的软件源&#xff0c;或者您的软件源列表已经过期。 解决&#xff1a; 如果您使用的是 Ubuntu 或类似…

(十二)大数据实战——hadoop集群之HDFS高可用自动故障转移

前言 本节内容主要介绍一下hadoop集群下实现HDFS高可用的自动故障转移&#xff0c;HDFS高可用的自动故障转移主要通过zookeeper实现故障的监控和主节点的切换。自动故障转移为 HDFS 部署增加了两个新组件&#xff1a;ZooKeeper 和 ZKFailoverController &#xff08;ZKFC&…

【Python】Pandas 简介,数据结构 Series、DataFrame 介绍,CSV 文件处理,JSON 文件处理

序号内容1【Python】Pandas 简介&#xff0c;数据结构 Series、DataFrame 介绍&#xff0c;CSV 文件处理&#xff0c;JSON 文件处理2【Python】Pandas 数据清洗操作&#xff0c;常用函数总结 文章目录 1. Pandas 简介2. Pandas 数据结构1. Series&#xff08;一维数据&#xff…

【LeetCode】24.两两交换链表中的节点

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a…

css-3:什么是响应式设计?响应式的原理是什么?如何做?

1、响应式设计是什么&#xff1f; 响应式网站设计&#xff08;Responsive WEB desgin&#xff09;是一个网络页面设计布局&#xff0c;页面的设计与开发应当根据用户行为以及设备环境&#xff08;系统平台、屏幕尺寸、屏幕定向等&#xff09;进行相应的相应和调整。 描述响应式…

【数字化处理】仿生假体控制中肌电信号的数字化处理研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

309. 买卖股票的最佳时机含冷冻期

目录 一、题目 二、代码 一、题目 309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();//0表示持有股票的状态&#xff0c;1表示不持有股票在…

MySQL中的视图

系列文章目录 MySQL常见的几种约束 MySQL中的函数 MySQL中的事务 文章目录 系列文章目录前言一、视图的概念二、视图的好处三、SQL展示总结 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&…

机器学习04-数据理解之数据可视化-(基于Pima数据集)

什么是数据可视化? 数据可视化是指通过图表、图形、地图等视觉元素将数据呈现出来的过程。它是将抽象的、复杂的数据转化为直观、易于理解的视觉表达的一种方法。数据可视化的目的是帮助人们更好地理解数据&#xff0c;从中发现模式、趋势、关联和异常&#xff0c;从而作出更明…