我正在为失语症患者开发一个应用程序,要求他们为特定问题选择适当的答案。例如,如果问题是“获取”,则他们应选择的答案是“公司”。当前,我有一个JSON文件,其中存储了问题和答案,我试图解析数据以获取其中的特定信息,这使我想到了第一个问题:在编写下面的代码之后,当我请求时,我不断出错打印,问题和答案。
我的下一个问题是解析后,我想将数据分成不同的字典,例如:
questions = ["include","acquire"]
answers = [["sale","border","water foxtail","condition"],["company", "capacity", "debt","note"]]
问题字典应该用我的JSON文件中的键“ QN”中的值填充,而答案是键“ ANS”,“ PHO”,“ RAN”中的值。我知道这有点令人困惑,但我想保留答案字典的键和值。抱歉,您的问题很长,谢谢您的帮助!
答案 0 :(得分:0)
首先让我们逐步了解您的解码流程。
Bundle.main
访问json文件的路径guard let path = Bundle.main.path(forResource: "questions", ofType: "json") else {
return
}
Data
。let data = try Data(contentsOf: path)
QnAns
对象,因此传递给解码器的类型必须是Array
的{{1}},因此我们这样写:QnAns
let result = try JSONDecoder().decode([QsAns].self, from: data)
和[QsAns]
的含义相同
Array<QsAns>
语句可以通过向我们传递抛出给我们的确切错误来简化调试,因此,请充分利用该错误并在{{ 1}}像这样关闭:do-catch
考虑到所有这些,我们使用了一个非常优雅的代码,该代码也不是很长,而且读起来也很不错:
catch
不幸的是,您的json看起来不适合解码器读取并能够确定其内容。为了使它起作用,我们需要将对象嵌入到数组中。 所以代替:
catch { print(error) }
我们需要
guard let path = Bundle.main.path(forResource: "questions", ofType: "json") else {
return
}
do {
let data = try Data(contentsOf: path)
let result = try JSONDecoder().decode([QsAns].self, from: data)
} catch {
print(error)
}
应该差不多了。让我知道如何进行,如果仍然不清楚某些问题,我将很乐意更新答案。祝你好运!
我们可以使用{ ... },
{ ... }
函数将这两个数组轻松转换为字典
[
{ ... },
{ ... }
]