首页 > 解决方案 > 快速从 JSON 创建一个数组

问题描述

我正在尝试将 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()
    }

标签: arraysjsonswift

解决方案


您匹配属性名称,因此您可以完全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结构属性的键。

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

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

推荐阅读