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

时间:2020-11-05 18:18:15

标签: json swift xcode dictionary parsing

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

enter image description here

这是JSON文件的屏幕截图。 enter image description here

我的下一个问题是解析后,我想将数据分成不同的字典,例如:

questions = ["include","acquire"]
answers = [["sale","border","water foxtail","condition"],["company", "capacity", "debt","note"]]

问题字典应该用我的JSON文件中的键“ QN”中的值填充,而答案是键“ ANS”,“ PHO”,“ RAN”中的值。我知道这有点令人困惑,但我想保留答案字典的键和值。抱歉,您的问题很长,谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

?解码

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

let result = try JSONDecoder().decode([QsAns].self, from: data) [QsAns]的含义相同

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

?天哪!

应该差不多了。让我知道如何进行,如果仍然不清楚某些问题,我将很乐意更新答案。祝你好运!

?奖励问题!

我们可以使用{ ... }, { ... } 函数将这两个数组轻松转换为字典

[
    { ... }, 
    { ... }
]