【发布时间】:2021-05-22 20:57:25
【问题描述】:
当我试图在嵌套的 json 对象中显示来自数组的信息时,我目前正在碰壁。我不明白我哪里出错了,所以任何帮助都将不胜感激。 **我收到的当前错误是:致命错误:索引超出范围
我相信我的问题可能与我如何定位信息有关。我已经使用“!! ... !!”进行了概述我认为发生错误的关键领域。
我对 json 对象的嵌套方式感到困惑。如果我是正确的,我想要的目标的层次结构是:对象(主要对象)-> 对象(数据)-> 数组(newReleases)-> 字符串(prId)。话虽如此,我的印象是我的 self.posts = results.data.newReleases 将直接针对 newReleases 数组(我想要),然后将其打印在 contentView 文本(networkManager.posts[0].prID)
声明列表的内容视图:
struct ContentView: View {
@ObservedObject var networkManager = NetworkManager()
var body: some View {
NavigationView {
List{
Text(networkManager.posts[0].prID)
}
.navigationTitle("Json Test")
}
.onAppear{
self.networkManager.fetchData()
}
}
}
这是格式化的 JSON 数据的照片。
这就是我在应用中定义数据的方式:
// MARK: - Results
struct Results: Codable {
let data: DATAClass
enum CodingKeys: String, CodingKey {
case data = "DATA"
}
}
// MARK: - DATAClass
struct DATAClass: Codable {
let newReleases, exclusives, preorders, backIssues: [BackIssue]
}
// MARK: - BackIssue
struct BackIssue: Codable {
let totalcount: String
let sectionName: SectionName
let sectionLink, prID, prParentid, prTtle: String
let prPrice, prLprice, prSimg, prBimg: String
enum CodingKeys: String, CodingKey {
case totalcount
case sectionName = "section_name"
case prID = "pr_id"
case prTtle = "pr_ttle"
case prPrice = "pr_price"
}
}
}
enum SectionName: String, Codable {
case featuredNewReleases = "FEATURED_NEW_RELEASES"
case recommendedBackIssues = "RECOMMENDED_BACK_ISSUES"
case recommendedPreOrders = "RECOMMENDED_PRE_ORDERS"
}
这是我尝试解码 json 对象的地方:
@Published var posts = !! [BackIssue]() !!
func fetchData() {
if let url = URL(string:" https://www.midtowncomics.com/wcfmt/services/product.svc/load-featured-sections?apiKey=&mtUser=&mtPass=&sh_id=76367&pgn=home&app_id") {
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { data, response, error in
if error == nil {
let decoder = JSONDecoder()
if let safeData = data {
do {
let results = try decoder.decode(Results.self, from: safeData)
DispatchQueue.main.async {
!! self.posts = results.data.newReleases !!
}
} catch {
print(error)
}
}
}
}
task.resume()
}
}
}
【问题讨论】:
-
您没有显示您尝试解码数据的位置,或者您在说时遇到的错误。你能澄清一下你遇到了什么问题吗?
-
对不起。我完成了忘记添加它。我现在已经更新了我尝试解码信息的位置。
-
您还没有说是否遇到错误或预期结果与您遇到的情况。
-
@jnpdx 嘿,对不起。我已经更新了帖子并澄清了我的问题。我遇到了一个错误:致命错误:尝试在内容视图中显示数据时索引超出范围。这基本上就是我目前正在尝试做的所有事情;正确定位数据并显示它。所以我不确定是我的方法不对,还是我定位数据的方式。