Ayu*_*and 0 xcode parsing json dictionary swift
我正在为失语症患者开发一款应用程序,要求他们为特定问题选择合适的答案。例如,如果问题是“获取”,则他们应该选择的相应答案是“公司”。目前我有一个 JSON 文件,其中存储了问题和答案,我正在尝试解析数据以从中获取特定信息,这让我想到了第一个问题:编写下面的代码后,当我请求时,我不断收到错误消息打印、问题和答案。
我的下一个问题是在解析之后我想将数据分成不同的字典,如下所示:
questions = ["include","acquire"]
answers = [["sale","border","water foxtail","condition"],["company", "capacity", "debt","note"]]
Run Code Online (Sandbox Code Playgroud)
问题字典应该填充 JSON 文件中键“QN”的值,答案是键“ANS”、“PHO”、“RAN”的值。我知道这有点令人困惑,但我想保留答案字典的键和值。很抱歉问了这么长的问题,感谢您的帮助!
Wit*_*ski 10
首先让我们逐步了解解码流程。
Bundle.main来访问 json 文件的路径guard let path = Bundle.main.path(forResource: "questions", ofType: "json") else {
return
}
Run Code Online (Sandbox Code Playgroud)
Data直接从 url 进行初始化。let data = try Data(contentsOf: path)
Run Code Online (Sandbox Code Playgroud)
QnAns对象,因此传递给解码器的类型需要是,Array所以QnAns我们这样写:let result = try JSONDecoder().decode([QsAns].self, from: data)
Run Code Online (Sandbox Code Playgroud)
两者
[QsAns]和Array<QsAns>意思相同
do-catch语句可以通过向我们传递向我们抛出的确切错误来轻松调试,因此让我们利用这一点并将其打印在闭包中,catch如下所示:catch { print(error) }
Run Code Online (Sandbox Code Playgroud)
考虑到所有这些,我们得到了一个非常优雅的代码,它也不是很长并且读起来很好:
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)
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,您的 json 看起来对于解码器读取并无法弄清楚其内容是有效的。为了使其工作,我们需要将对象嵌入到数组中。所以而不是:
{ ... },
{ ... }
Run Code Online (Sandbox Code Playgroud)
我们需要
[
{ ... },
{ ... }
]
Run Code Online (Sandbox Code Playgroud)
应该差不多就是这样了。让我知道进展如何,如果仍有一些问题不清楚,我会很乐意更新答案。祝你好运!
zip我们可以使用函数轻松地将这两个数组转换为字典
// type of dict will be [String: [String]]
let dict = Dictionary(uniqueKeysWithValues: zip(questions, answers))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7189 次 |
| 最近记录: |