【问题标题】:create an array from JSON in swift快速从 JSON 创建一个数组
【发布时间】:2019-05-27 06:44:32
【问题描述】:

我正在尝试将 JSON 数据转换为数组,但我真的不知道该怎么做。

我获取数据并将其保存在字符串中,我也可以将其显示在显示器上。

struct User_Hosting: Codable {
    let company_name: String
    let website: String
    let street: String
    let housenumber: String
    let zip: String
    let city: String    

    enum CodingKeys: String, CodingKey {
        case company_name = "company_name"
        case website = "website"
        case street = "street"
        case housenumber = "housenumber"
        case zip = "zip"
        case city = "city"
    }
}

这里还有一些其他代码:

let url = URL(string: "myURL.com")

        URLSession.shared.dataTask(with: url!, completionHandler: { [weak self] (data, response, error) in
            guard let data = data, error == nil else {
                print(error?.localizedDescription ?? "An error occurred")
                return
            }
            DispatchQueue.main.async {
                self?.dataSource = try! JSONDecoder().decode([User_Hosting].self, from: data)
            }
        }).resume()
    }

【问题讨论】:

  • 当结构的属性名和服务器的属性名相同时,你为什么使用CodingKeys
  • 添加您从 API 获得的 JSON response。
  • 您在self?.dataSource = try! JSONDecoder().decode([User_Hosting].self, from: data) 中的dataSource 属性是什么?
  • 在 Swift 中,我们更喜欢 Camel Case (camelCase) 而不是 Snake Case (snake_case)。所以,你可以使用这条线let decoder = JSONDecoder() decoder.decordingStrategy = .convertFromSnakeCase,然后使用let company_name as let companyName。
  • 不要try!,使用正确的do {...} catch { print(error) },这样你就不会错过解码过程中可能发生的任何错误。您的问题的答案很可能在该印刷声明中。并在DispatchQueue.main.async之前进行解码

标签: arrays json swift


【解决方案1】:

您的CodingKeys 与属性名称匹配,因此您可以完全摆脱enum

struct UserHosting: Codable {
    let companyName: String
    let website: String
    let street: String
    let housenumber: String
    let zip: String
    let city: String    
}

由于您在 JSON 中有一些蛇形大小写键,您可以将 JSONDecoder.keyDecodingStrategy 更改为 convertFromSnakeCase,就像这样

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase

上面的解码器会将company_name 等键分配给结构的companyName 属性。

最后,您可以在 do-catch 块中解码您的 JSON,因此如果出现错误,我们将收到一条消息,说明出了什么问题。

do {
    self.dataSource = try decoder.decode([UserHosting].self, from: data)
} catch {
    print("JSON Decoding Error \(error)")
}

【讨论】:

  • 正如之前多次指出的那样,不要使用localizedDescription do print(error) 来获取更详细的错误消息
  • @AamirRq 我想将字母索引放在 UITableview 的右侧,只对公司名称进行排序,但我不知道哪个数组有数据。
猜你喜欢
  • 2015-06-13
  • 1970-01-01
  • 2019-08-20
  • 2013-06-11
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
相关资源
最近更新 更多