【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.mzph.cn/news/20114.shtml

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

相关文章

AP5179 高端电流采样降压恒流驱动IC SOP8 LED车灯电源驱动

产品描述 AP5179是一款连续电感电流导通模式的降压恒流源&#xff0c;用于驱动一颗或多颗串联LED输入电压范围从 5 V 到 60V&#xff0c;输出电流 最大可达 2.0A 。根据不同的输入电压和外部器件&#xff0c; 可以驱动高达数十瓦的 LED。内置功率开关&#xff0c;采用高端电流…

PHP8的运算符-PHP8知识详解

运算符是可以通过给出的一或多个值&#xff08;用编程行话来说&#xff0c;表达式&#xff09;来产生另一个值&#xff08;因而整个结构成为一个表达式&#xff09;的东西。 PHP8的运算符有很多&#xff0c;按类型分有一元运算符、二元运算符、三元运算符。 一元运算符只对一…

选择适合的项目管理系统,了解有哪些选择和推荐

随着科技的进步和全球竞争的加剧&#xff0c;项目管理已经成为企业成功的关键要素。为了更好地组织和监控项目&#xff0c;许多企业和组织正在采用项目管理系统(PMS)。本文将探讨项目管理系统的主要组成部分以及其在实际应用中的优势。 “项目管理系统有哪些?国际上比较常见的…

侧边栏的打开与收起

侧边栏的打开与收起 <template><div class"box"><div class"sideBar" :class"showBox ? : controller-box-hide"><div class"showBnt" click"showBox!showBox"><i class"el-icon-arrow-r…

天气API强势对接

&#x1f935;‍♂️ 个人主页&#xff1a;香菜的个人主页&#xff0c;加 ischongxin &#xff0c;备注csdn ✍&#x1f3fb;作者简介&#xff1a;csdn 认证博客专家&#xff0c;游戏开发领域优质创作者,华为云享专家&#xff0c;2021年度华为云年度十佳博主 &#x1f40b; 希望…

分布式系统的 38 个知识点

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…

静态路由下一跳地址怎么确定(静态路由配置及讲解)

一、用到的所有命令及功能 ①ip route-static 到达网络地址 子网掩码 下一跳 // 配置静态路由下一跳指的是和当前网络直接连接的路由器的接口地址非直连网段必须全部做路由路径是手工指定的&#xff0c;在大规模网络上不能用&#xff0c;效率低&#xff0c;路径是固定的稳定的…

瑞吉外卖实战-笔记

软件开发的流程 角色分工 软件环境 开发环境的搭建 数据库环境 maven环境 1.创建完成后&#xff0c;需要检查一下编码、maven仓库、jdk等 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</a…

Python实现GA遗传算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

TSINGSEE青犀视频安防监控EasyCVR视频汇聚平台电子地图定位偏移的排查与解决

安防监控EasyCVR视频汇聚综合管理平台具有强大的数据接入、处理及分发能力&#xff0c;平台可提供视频监控直播、云端录像、云存储、录像检索与回看、告警上报与查询、平台级联、云台控制、语音对讲、电子地图、轨迹跟踪、H.265自动转码等视频能力。 在视频监控管理平台TSINGSE…

word转pdf两种方式(免费+收费)

一、免费方式 优点&#xff1a;1、免费&#xff1b;2、在众多免费中挑选出的转换效果相对较好&#xff0c;并且不用像openOffice那样安装服务 缺点&#xff1a;1、对字体支持没有很好&#xff0c;需要安装字体库或者使用宋体&#xff08;对宋体支持很好&#xff09;2、对于使…

2023 电赛 E 题 K210 方案--K210实现矩形识别

相关库介绍 sensor&#xff08;摄像头&#xff09; sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(10) reset()&#xff1a;重置并初始化单目摄像头 set_pixformat()&#xff1a;设置摄像头输出格式&#xff0c…

中小学分班查询系统如何制作?这个方法值得借鉴

暑假即将结束&#xff0c;新学年即将开始&#xff0c;学校面临着一个重要的任务&#xff0c;那就是学生的分班问题。这个问题涉及到新生入学的分班&#xff0c;以及低年级学生升入高年级时的分班。对于负责分班的老师们来说&#xff0c;这无疑增加了不少工作量和挑战。 在开学…

上榜 Gartner | 中国领先的实时数据管理厂商 DolphinDB

在 Gartner 近日发布的 Hype Cycle for Data, Analytics and AI in China, 2023 报告中&#xff0c;DolphinDB 位列实时数据管理代表厂商。这是自去年 DolphinDB 入选 Gartner《中国数据库管理系统供应商甄选》后&#xff0c;又一次凭借领先的产品能力获得国际权威第三方分析机…

P2P网络NAT穿透原理(打洞方案)

1.关于NAT NAT技术&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是一种把内部网络&#xff08;简称为内网&#xff09;私有IP地址转换为外部网络&#xff08;简称为外网&#xff09;公共IP地址的技术&#xff0c;它使得一定范围内的多台主机只…

python算法指南程序员经典,python算法教程pdf百度云

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;你也能看懂的python算法书 pdf&#xff0c;python算法教程这本书怎么样&#xff0c;现在让我们一起来看看吧&#xff01; 给大家带来的一篇关于算法相关的电子书资源&#xff0c;介绍了关于算法、详解、算法基础方面的内…

Kaggle狗图像分类实战

文章目录 Kaggle狗图像分类实战d2l安装问题python语法学习os.path.joind2l 数据加载streamlit Kaggle狗图像分类实战 d2l安装问题 d2l安装失败&#xff0c;报错如上图 去下面的网站下载到该项目文件目录下再pip install即可 Python d2l项目安装包(第三方库)下载详情页面 - …

ATFX汇评:英央行利率决议来袭,大概率加息25基点

ATFX汇评&#xff1a;今日19:00&#xff0c;英国央行公布利率决议、会议纪要和货币政策报告&#xff1b;半小时后&#xff0c;英国央行行长贝利召开货币政策新闻发布会。当前英国央行基准利率5%&#xff0c;市场预期将加息25基点至5.25%&#xff0c;假若符合预期&#xff0c;则…

【css】背景图片附着

属性&#xff1a;background-attachment 属性指定背景图像是应该滚动还是固定的&#xff08;不会随页面的其余部分一起滚动&#xff09;。 background-attachment: fixed&#xff1a;为固定&#xff1b; background-attachment: scroll为滚动 代码&#xff1a; <!DOCTYPE h…

opencv的Mask操作,选择图片中感兴趣的区域

最近做目标检测任务的时候&#xff0c;需要对固定区域的内容进行检测&#xff0c;要用到opencv的mask操作&#xff0c;选择图片固定的区域 代码 import cv2 import numpy as npimg cv2.imread(data/images/smoking.png)# 弹出一个框 让你选择ROI | x,y是左上角的坐标 x,y,w,…