我正在尝试从 a 获取 jsongithubusercontent
(URL: https://raw.githubusercontent.com/nacrt/SkyblockClient-REPO/main/files/mods.json https://raw.githubusercontent.com/nacrt/SkyblockClient-REPO/main/files/mods.json)到一个 Swift 文件,然后将其转换为我可以操作的东西,例如,使用enabled
(如下)选中/取消选中复选框。
所讨论的 JSON 实际上是一个 JSON 数组,这是主要问题。我不确定下面的代码是否有效,因为我还没有导入 JSON。
到目前为止,我发现了这个:
struct ModsJSON: Decodable {
let id: String
let display: String
let description: String
let url: String
let config: Bool?
let enabled: Bool
let hidden: Bool
let icon: String
let categories: Array<String>
let actions: Array<OptionAction>?
let warning: ActionWarning?
}
let jsonData = JSON.data(using: .utf8)! //JSON being the imported json
let mods_json: [ModsJSON] = try! JSONDecoder().decode([ModsJSON].self, from: jsonData)
我是 swift 的初学者,我意识到这应该很容易,但我在任何地方都找不到实际的答案。
macOS Big Sur - 最新的 Swift 和 Xcode 版本。
对于初学者来说这并不容易,你必须使用异步加载数据URLSession
.
JSON 字典中的某些键丢失,因此您必须将更多结构成员声明为可选。
键的类型actions
and warning
丢失了,我把它们注释掉了,代码没有它们也能工作
struct Mod: Decodable {
let id: String
let display: String
let description: String
let url: String?
let config: Bool?
let enabled: Bool?
let hidden: Bool?
let icon: String?
let categories: [String]?
// let actions: Array<OptionAction>?
// let warning: ActionWarning?
}
let url = URL(string: "https://raw.githubusercontent.com/nacrt/SkyblockClient-REPO/main/files/mods.json")!
let task = URLSession.shared.dataTask(with: url) { (data, _, error) in
if let error = error { print(error); return }
do {
let result = try JSONDecoder().decode([Mod].self, from: data!)
print(result)
} catch { print(error) }
}
task.resume()
您的代码中有一些不好的做法:
- 代替
try!
始终使用do - catch
如果可能发生错误则阻止。
- Swift 中的变量名是
lowerCamelCase
而不是snake_case
.
- 不要注释编译器可以推断的类型。
- 数组中使用的结构应以单数形式命名(
Mod
)和JSON后缀毫无意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)