首页 > 解决方案 > macOS - 从 Raw Github + Parsing 获取 JSON 数据

问题描述

我正在尝试将 json 从githubusercontent(URL: 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 版本。

标签: arraysjsonswift

解决方案


这对初学者来说并不容易,您必须使用URLSession.

JSON 字典中的某些键丢失了,因此您必须将更多结构成员声明为可选。

actionswarning缺失的类型,我将它们注释掉,没有它们的代码也可以工作

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后缀是没有意义的。

推荐阅读