从本地 JSON 文件解析数据 (SWIFT)

Ayu*_*and 0 xcode parsing json dictionary swift

我正在为失语症患者开发一款应用程序,要求他们为特定问题选择合适的答案。例如,如果问题是“获取”,则他们应该选择的相应答案是“公司”。目前我有一个 JSON 文件,其中存储了问题和答案,我正在尝试解析数据以从中获取特定信息,这让我想到了第一个问题:编写下面的代码后,当我请求时,我不断收到错误消息打印、问题和答案。

在此输入图像描述

这是 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

首先让我们逐步了解解码流程。

解码

  1. 如果您直接在应用程序目标中执行此代码,而不是在某个单独的库中执行,则为了简单起见,您可以使用Bundle.main来访问 json 文件的路径
guard let path = Bundle.main.path(forResource: "questions", ofType: "json") else {
    return
}
Run Code Online (Sandbox Code Playgroud)
  1. 为了解码 json,我们希望数据将其传递给解码器,并且我们可以在不将其转换为字符串的情况下完成此操作,因此让我们Data直接从 url 进行初始化。
let data = try Data(contentsOf: path)
Run Code Online (Sandbox Code Playgroud)
  1. 由于我们正在解码多个QnAns对象,因此传递给解码器的类型需要是,Array所以QnAns我们这样写:
let result = try JSONDecoder().decode([QsAns].self, from: data)
Run Code Online (Sandbox Code Playgroud)

两者[QsAns]Array<QsAns>意思相同

  1. 在此流程中可能会发生许多错误,并且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)