【发布时间】:2022-01-18 07:32:52
【问题描述】:
我正在努力理解如何从我的 JSON 文件中获取数据并使用它(例如在按下按钮时,它会更改标签文本或描述),尽管我已经阅读了无数的线程,但我仍然卡住了,但这里是我从这些文章和 stackoverflow 线程中尝试做的事情。
假设我有一个名为 Animals.json 的 json 文件:
{
"animal": [
{
"name":"Cat",
"image" : "cat.jpg",
"category": "mammal"
},
{
"name":"Eagle",
"image" : "eagle.jpg",
"category": "Bird",
}
]
}
我在一个名为 Animals.swift 的单独文件中创建了一个结构:
struct Animals: Codable {
var animal: [Animal]
}
然后是另一个名为 Animal.swift 的文件:
struct Animal : Codable {
var name: String
var image: String
var category: String
}
这是我的 MainVC 中的代码:
import UIKit
class InstrumentsVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let localData = self.readLocalFile(forName: "Animals") {
self.parse(jsonData: localData)
}
}
private func readLocalFile(forName name: String) -> Data? {
do {
if let bundlePath = Bundle.main.path(forResource: name,
ofType: "json"),
let jsonData = try String(contentsOfFile: bundlePath).data(using: .utf8) {
return jsonData
}
} catch {
print(error)
}
return nil
}
private func parse(jsonData: Data) {
do {
let decodedData = try JSONDecoder().decode(Animals.self,
from: jsonData)
print("animal: ", decodedData.animal.first?.name ?? "")
} catch {
print("decode error")
}
}
private func loadJson(fromURLString urlString: String,
completion: @escaping (Result<Data, Error>) -> Void) {
if let url = URL(string: urlString) {
let urlSession = URLSession(configuration: .default).dataTask(with: url) { (data, response, error) in
if let error = error {
completion(.failure(error))
}
if let data = data {
completion(.success(data))
}
}
urlSession.resume()
}
}
@IBAction func nextCategory(_ sender: UIButton) {
//I'll write a function that allows changing categories then loading an image that will update an outlet and labels
}
}
我还没有开始调用 loadJson 函数的部分,因为我打印了一个解码错误,而且我是 JSON 解码/解析的新手,我想知道哪里出了问题以及如何修复那。 这个想法是当我要按下一个按钮时,它会循环遍历我的 JSON 的“类别”部分(我还没有编写函数,但这应该不是问题),然后我有另一个按钮可以通过“名称”触发循环(这是一个简化的 JSON,因为会有很多来自同一类别的元素;它也不会是动物,而是一些与音乐相关的东西,我只是认为这样更容易理解用动物而不是放一些音乐理论的东西)。
现在我被打印在 readLocalFile 函数中的错误卡住了;然后从我读过的多篇文章中,我显然需要调用 loadJson 函数,但我还不太确定如何完成所有这些以获取每个元素的名称/图像/类别。 谢谢
【问题讨论】:
-
您的代码对我有用。您确定您在此处粘贴的代码与您的项目中的代码相同吗?
-
是的,除了其他插座和按钮外,它的代码完全相同
-
你的json不正确"category": "Bird",结尾应该有','
-
感谢 Noor Ahmed,这是一个错字,我忘记在这里更正了,因为我在这篇文章中更改了我的 json 的实际内容,以便更容易理解,但我的 json 文件格式正确;但是,由于下面的答案,我找到了错误的原因:我的结构的名称与我的 JSON 略有不同。谢谢大家!
-
无关,但
let jsonData = try String(contentsOfFile: bundlePath).data(using: .utf8)应该是let jsonData = try Data(contentsOfFile: bundlePath),不需要转换...