gpt4 book ai didi

ios - 使用可解码和 JSON

转载 作者:行者123 更新时间:2023-11-28 10:48:22 25 4
gpt4 key购买 nike

我有一个格式如下的 JSON 文件:

[
{
"QID": "B002",
"Stash": "Basic",
"Category": "Geography",
"Question": "What is the highest mountain on earth?",
"Answer": "Mt Everest"
},
{
"QID": "B003",
"Stash": "Basic",
"Category": "General",
"Question": "What is the gestation period for a pregnant elephant?",
"Answer": "2 years"
}
]

我正在尝试构建一个结构,以便将我的 JSON 文件中的所有问题加载到我的测验应用程序中。到目前为止,与我从 JSON 和苹果添加的新“可解码”事物中研究的内容相比,我的 Swift 代码如下(请注意,失败的尝试已被注释掉):

var STASHES_SELECTED = ["BasicStash", "MediumStash", "HardStash"]

struct TriviaQuestion: Decodable {
let QID: String
let Stash: String
let Categoroy: String
let Question: String
let Answer: String
}

func loadQuestionStash()
{
/*
for var i in STASHES_SELECTED
{
let url = Bundle.main.url(forResource: STASHES_SELECTED[i], withExtension: "JSON") //CANT GET THIS TO WORK!, SAYS CANNOT SUBSCRIPT TYPE [STRING] WITH INDEX TYPE 'STRING'
}*/

if let url = Bundle.main.url(forResource: "BasicStash", withExtension: "JSON")
{
let json = try? Data(contentsOf: url)

let questions = try? JSONDecoder().decode(TriviaQuestion.self, from: json!)
print (questions!) //FATAL ERROR, FOUND NIL

}
}

正如您从代码注释中看到的那样,目前给我一个 fatal error “展开时发现 nil”。所以我假设前一行 JSONDecoder().惨败。
我不确定我这样做是否正确,因为这是我第一次使用 JSON,而且我只是按照教程和在线帖子做了很多千篇一律的事情。我真的很感激这里的一些帮助。还有系统添加TriviaQuestion后的.self(我觉得问题可能出在这里面)

最佳答案

正如@Oxthor 提到的打字错误,

我只想补充一点,始终使用 quicktype.io创建您的数据 struct。您将避免错别字并节省时间:

// To parse the JSON, add this file to your project and do:
//
// let triviaQuestion = Array.from(json: jsonString)!

import Foundation


struct TriviaQuestion: Codable {
let answer: String
let category: String
let qID: String
let question: String
let stash: String
}

// MARK: Top-level extensions -

extension Array where Element == TriviaQuestion {
static func from(json: String, using encoding: String.Encoding = .utf8) -> [PurpleTriviaQuestion]? {
guard let data = json.data(using: encoding) else { return nil }
return from(data: data)
}

static func from(data: Data) -> [TriviaQuestion]? {
let decoder = JSONDecoder()
return try? decoder.decode([TriviaQuestion].self, from: data)
}

static func from(url urlString: String) -> [TriviaQuestion]? {
guard let url = URL(string: urlString) else { return nil }
guard let data = try? Data(contentsOf: url) else { return nil }
return from(data: data)
}

var jsonData: Data? {
let encoder = JSONEncoder()
return try? encoder.encode(self)
}

var jsonString: String? {
guard let data = self.jsonData else { return nil }
return String(data: data, encoding: .utf8)
}
}

// MARK: Codable extensions -

extension TriviaQuestion {
enum CodingKeys: String, CodingKey {
case answer = "Answer"
case category = "Category"
case qID = "QID"
case question = "Question"
case stash = "Stash"
}
}

关于ios - 使用可解码和 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47510165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com