【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进行简单的网络数据请求的六步:
- 创建API的URL:构建API的URL,包括指定基本地址、路径和查询参数等。
- 创建一个NSURL对象:使用URL字符串来创建NSURL对象,以便在请求中使用。
- 创建NSURLRequest:使用NSURL对象创建一个NSURLRequest对象,该对象将包含请求的类型(GET、POST等)和其他必要的信息。
- 创建NSURLSession:初始化NSURLSession来管理网络会话,它是发送请求的主要组件。
- 创建NSURLSessionDataTask:使用NSURLSession创建一个NSURLSessionDataTask对象,用于发送网络请求,并在请求完成后接收数据。
- 处理请求结果:在请求完成后,处理服务器返回的数据并进行相应的处理,例如解析数据或更新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数据来源:
和风每日天气
相关文章:

【iOS】json数据解析以及简单的网络数据请求
文章目录 前言一、json数据解析二、简单的网络数据请求三、实现访问API得到网络数据总结 前言 近期写完了暑假最后一个任务——天气预报,在里面用到了简单的网络数据请求以及json数据的解析,特此记录博客总结 一、json数据解析 JSON是一种轻量级的数据…...

Kubernetes客户端认证—— 基于ServiceAccount的JWTToken认证
1、概述 在 Kubernetes 官方手册中给出了 “用户” 的概念,Kubernetes 集群中存在的用户包括 “普通用户” 与 “ServiceAccount”, 但是 Kubernetes 没有普通用户的管理方式,通常只是将使用集群根证书签署的有效证书的用户都被视为合法用户。…...

45.ubuntu Linux系统安装教程
目录 一、安装Vmware 二、Linux系统的安装 今天开始了新的学习,Linux,下面是今天学习的内容。 一、安装Vmware 这里是在 Vmware 虚拟机中安装 linux 系统,所以需要先安装 vmware 软件,然 后再安装 Linux 系统。 所需安装文件:…...

Jmeter函数助手(一)随机字符串(RandomString)
一、目标 实现一个请求单次调用,请求体里多个集合中的相同参数(zxqs)值随机从序列{01、02、03、03、04、05、06、07、08}中取 若使用CSV数据文件、用户参数等参数化手段,单次执行请求,请求体里多个集合中的相同参数&a…...

SpringCloud之微服务API网关Gateway介绍
文章目录 1 微服务API网关Gateway1.1 网关简介1.2 Spring Cloud Gateway介绍1.3 Gateway特性1.4 Gateway核心概念1.4.1 路由1.4.1.1 定义1.4.1.2 动态路由 1.4.2 断言1.4.2.1 默认断言1.4.2.2 自定义Predicate 1.4.3 过滤器1.4.3.1 默认过滤器1.4.3.2 自定义Filter(…...

机器学习入门之 pandas
pandas 有三种数据结构 一种是 Series 一种是 Dataframe import pandas as pd import numpy as np score np.random.randint(0,100,[10,5])score[0,0] 100Datascore pd.DataFrame(score)subject ["语文","数学","英语","物理&quo…...

Django之JWT库与SimpleJWT库的使用
Django之JWT库与SimpleJWT库的使用 JWTJWT概述头部(header)载荷(payload)签名(signature) Django使用JWT说明jwt库的使用安装依赖库配置settings.py文件配置urls.py文件创建视图配置权限 SimpleJWT库的使用安装SimpleJWT库配置Django项目配置路由创建用户接口测试身份认证自定义…...

Jmeter远程服务模式运行时引用csv文件的路径配置
问题 在使用jmeter过程中,本机的内存等配置不足,启动较多的线程时,可以采用分布式运行。 在分布式运行的时候,jmeter会自动将脚本从master主机发送到remote主机上,所以不需要考虑将脚本拷贝到remote主机。但是jmeter…...
《OWASP代码审计》学习——注入漏洞审计
一、注入的概念 注入攻击允许恶意用户向应用程序添加或注入内容和命令,以修改其行为。这些类型的攻击是常见且广泛的,黑客很容易测试网站是否易受攻击,攻击者也很容易利用这些攻击。如今,它们在尚未更新的遗留应用程序中非常常见…...

Linux虚拟机中安装MySQL5.6.34
目录 第一章、xshell工具和xftp的使用1.1)xshell下载与安装1.2)xshell连接1.3)xftp下载安装和连接 第二章、安装MySQL5.6.34(不同版本安装方式不同)2.1)关闭防火墙,传输MySQL压缩包到Linux虚拟机2.2&#x…...

Django的FBV和CBV
Django的FBV和CBV 基于django开发项目时,对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV,function base views,其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…...

[每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目
文章目录 1.参考项目2.技能点3.GO的Dockerfile配置后端的结构如图Dockerfile先手动docker调试服务是否可以启动报错 4.Vue的Dockerfile配置前端的结构如图nginx_docker.confDockerfile构建 5.docker-compose 整合前后端docker-compose.yml错误记录(1)ip端…...

springboot-mybatis的增删改查
目录 一、准备工作 二、常用配置 三、尝试 四、增删改查 1、增加 2、删除 3、修改 4、查询 五、XML的映射方法 一、准备工作 实施前的准备工作: 准备数据库表 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动…...

HTML5(H5)的前生今世
目录 概述HTML5与其他HTML的区别CSS3与其他CSS版本的区别总结 概述 HTML5是一种用于构建和呈现网页的最新标准。它是HTML(超文本标记语言)的第五个版本,于2014年由万维网联盟(W3C)正式推出。HTML5的前身可以追溯到互联…...

抽象工厂模式(Abstract Factory)
抽象工厂模式提供一个创建一组相关或相互依赖的对象的接口,而无须指定它们具体的类,每个子类可以生产一系列相关的产品。 The Abstract Factory Pattern is to provide an interface for creating families of related or dependent objects without s…...
Java 实现下载文件工具类
package com.liunian.utils;import lombok.SneakyThrows;import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream;/*** ClassName DownloadFileUtils* Author liuyan 下载文件工具类…...
C# 12 预览版的新功能
作者:Kathleen Dollard 排版:Alan Wang Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的发布推进了 C# 12的发展。此预览版包含的功能为将来的性能增强奠定了基础。现在,您能够在库中更方便的使用内联函数。此预览版首次推出了一项实验…...

34.利用matlab解 多变量多目标规划问题(matlab程序)
1.简述 学习目标:适合解 多变量多目标规划问题,例如 收益最大,风险最小 主要目标法,线性加权法,权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) ; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…...
暑假刷题第18天--7/30
165. 小猫爬山 - AcWing题库(dfs) #include<iostream> #include<string> #include<bitset> #include<cstring> #include<algorithm> using namespace std; const int N18; bool vis[N]; int a[N],n,ans,sum[N],k; bool cmp(int x,int y){retur…...

通向架构师的道路之Apache整合Tomcat
一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构,它由: Web Server App Server DB Server 三大部分组成,其中: Web Server 置于企业防火墙外,这个防火墙,大家可以认为是…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...