You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift开发Quiz App:如何从JSON API获取特定组答案?

解决Quiz App仅显示特定答案组的问题

问题场景

开发Quiz App时,从JSON API拉取所有答案组后,当前代码会展示全部数据,但需求是仅加载并显示特定组(例如包含"tonight"、"tomorrow"、"this week"、"this month"的第二组)。

实现思路

API返回的questiondata.data是字符串键对应的字典结构,每个键对应一组题目与答案。要获取指定组,直接通过目标组的键(如第二组对应键"2")从字典中取值即可,无需遍历所有组数据。

修改后的完整代码

核心修改集中在ContentView的UI展示逻辑,替换原遍历所有组的代码为直接获取指定组数据:

import Foundation
import SwiftUI

struct ContentView: View {
    @StateObject var model = DataManager()
    // 设定目标组的键,第二组对应键为"2"
    let targetGroupKey = "2"
    
    var body: some View {
        VStack {
            if let qData = model.response?.record.questiondata.data,
               let targetQuest = qData[targetGroupKey] {
                VStack(spacing: 12) {
                    Text(targetQuest.question)
                        .font(.title)
                        .fontWeight(.semibold)
                    Text(targetQuest.answer1.text)
                    Text(targetQuest.answer2.text)
                    Text(targetQuest.answer3.text)
                    Text(targetQuest.answer4.text)
                }
                .padding()
            } else {
                Text("未找到指定组数据或加载失败")
            }
        }
        .task {
            await model.loadData()
        }
    }
}

@MainActor
class DataManager: ObservableObject  {
    @Published var response: APIResponse? = nil
    
    func loadData() async  {
        if let url = URL(string: "https://api.jsonbin.io/v3/b/641f82dcace6f33a22fbec99") {
            do {
                let (data, _) = try await URLSession.shared.data(from: url)
                response = try JSONDecoder().decode(APIResponse.self, from: data)
            } catch {
                print(error)
            }
        }
    }
    
}

struct APIResponse: Codable {
    let record: Record
    let metadata: Metadata
}

struct Metadata: Codable {
    let id: String
    let metadataPrivate: Bool
    let createdAt: String

    enum CodingKeys: String, CodingKey {
        case id
        case metadataPrivate = "private"
        case createdAt
    }
}

struct Record: Codable {
    let questiondata: QuestionData
}

struct QuestionData: Codable {
    var data: [String : Quest]
    
    struct AnyKey: CodingKey {
        var stringValue: String
        var intValue: Int?
        
        init?(stringValue: String) {  self.stringValue = stringValue  }
        init?(intValue: Int) { return nil }
    }
    
    init(from decoder: Decoder) throws {
        self.data = [:]
        let container = try decoder.container(keyedBy: AnyKey.self)
        container.allKeys.forEach { key in
            if let theQuest = try? container.decode(Quest.self, forKey: key) {
                self.data[key.stringValue] = theQuest
            }
        }
    }
    
}

struct Quest: Codable {
    let question: String
    let answer1, answer2, answer3, answer4: Answer
}

struct Answer: Codable {
    let logo, text: String

    enum CodingKeys: String, CodingKey {
        case logo
        case text = "Text"
    }
}

struct ContentView_Preview: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

关键说明

  1. 新增targetGroupKey常量,指定要加载的目标组键(第二组对应"2")
  2. 直接从qData字典中通过键获取对应Quest对象,省去遍历所有组的开销
  3. 添加容错处理,当指定组不存在或数据未加载完成时,显示提示文本
  4. 保留原有数据模型与网络请求逻辑,仅修改UI展示部分以符合需求

内容的提问来源于stack exchange,提问作者M. Overby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:55:03