SwiftUI-GitHub REST API中的JSON无法解析
我正在尝试使用GitHub的RESTAPI在SwiftUI中创建一个应用程序。我试图只检索给定用户追随者的登录名和个人资料图片,然后填充SwiftUI-GitHub REST API中的JSON无法解析,json,swift,swiftui,github-api,Json,Swift,Swiftui,Github Api,我正在尝试使用GitHub的RESTAPI在SwiftUI中创建一个应用程序。我试图只检索给定用户追随者的登录名和个人资料图片,然后填充列表 FollowersView.swift 代码进入打印(“获取失败:\(错误?.localizedDescription??“未知错误”)”并在崩溃前打印“未知错误”。在检查返回的数据时,它什么也没有发现,至少我说不出来。(我不完全习惯Xcode调试器)。我仔细检查了浏览器中的API响应、浏览器中响应中的字段以及可编码结构中属性的名称是否匹配。所以,我不确定
列表
FollowersView.swift
代码进入
打印(“获取失败:\(错误?.localizedDescription??“未知错误”)”
并在崩溃前打印“未知错误”。在检查返回的数据时,它什么也没有发现,至少我说不出来。(我不完全习惯Xcode调试器)。我仔细检查了浏览器中的API响应、浏览器中响应中的字段以及可编码结构中属性的名称是否匹配。所以,我不确定这里到底发生了什么。如果我正确理解了您的问题,有没有关于如何解决此问题的建议?。更新您的Codable
,如下所示:
import Foundation
// MARK: - FollowerElement
struct FollowerElement: Codable {
let login: String
let id: Int
let nodeID: String
let avatarURL: String
let gravatarID: String
let url, htmlURL, followersURL: String
let followingURL, gistsURL, starredURL: String
let subscriptionsURL, organizationsURL, reposURL: String
let eventsURL: String
let receivedEventsURL: String
let type: String
let siteAdmin: Bool
enum CodingKeys: String, CodingKey {
case login, id
case nodeID = "node_id"
case avatarURL = "avatar_url"
case gravatarID = "gravatar_id"
case url
case htmlURL = "html_url"
case followersURL = "followers_url"
case followingURL = "following_url"
case gistsURL = "gists_url"
case starredURL = "starred_url"
case subscriptionsURL = "subscriptions_url"
case organizationsURL = "organizations_url"
case reposURL = "repos_url"
case eventsURL = "events_url"
case receivedEventsURL = "received_events_url"
case type
case siteAdmin = "site_admin"
}
}
typealias Follower = [FollowerElement]
您可以从上述代码中删除不需要的属性
现在更新您的dataTask
方法
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Fetch failed: \(error.localizedDescription)")
} else {
if let data = data {
do {
let follower = try JSONDecoder().decode(Follower.self, from: data)
DispatchQueue.main.async {
print(follower.count)
}
} catch {
print(error)
}
}
}
}.resume()
“代码开始打印”它打印什么?它打印“未知错误”好的,我知道问题出在哪里了,谢谢。有两个问题。首先,您没有if/else,因此即使没有下载错误,您也会打印下载错误。其次,您说的是try?因此,如果有解码错误(而且确实有),你就扔掉你需要的信息。改用try/catch并打印错误。这解决了我的问题。非常感谢你!我很感激!
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Fetch failed: \(error.localizedDescription)")
} else {
if let data = data {
do {
let follower = try JSONDecoder().decode(Follower.self, from: data)
DispatchQueue.main.async {
print(follower.count)
}
} catch {
print(error)
}
}
}
}.resume()