【发布时间】:2017-11-27 11:42:15
【问题描述】:
我有一个格式如下的 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
}
}
正如您从代码 cmets 中看到的那样,当前给我一个致命错误“展开时发现 nil”。所以我假设上一行 JSONDecoder().惨败。
我不确定我是否正确地执行了此操作,因为这是我第一次使用 JSON,而且我在网上学习教程和帖子时几乎是千篇一律的。我真的很感激这里的一些帮助。 TriviaQuestion 之后的 .self 也是系统添加的(我认为问题可能出在某处)
【问题讨论】:
-
不要默默地忽略
try?抛出的错误——在do-catch块中使用try并打印出错误;它会告诉你到底出了什么问题。 -
另请注意,属性名称为
lowerCamelCase,而不是UpperCamelCase是 Swift 约定。如果您的 JSON 中的键不同,您可以定义自己的CodingKeys,比较例如 stackoverflow.com/q/44396500/2976878 -
即使在修正错字之后我仍然收到错误,所以我按照您的建议得到了这个:有一个错误!! typeMismatch(Swift.Dictionary
, Swift.DecodingError.Context(codingPath: [], debugDescription: "期望解码 Dictionary 但找到了一个数组。", underlyingError: nil)) -
将
.decode(TriviaQuestion.self更改为.decode([TriviaQuestion].self
标签: ios json swift xcode decode