arrays - 在 Swift 4 中使用 decodable 访问嵌入式 JSON

标签 arrays json swift urlsession decodable

我正在尝试访问一个特定的嵌入式字典数组来创建我的 swift 对象。我不确定如何在 JSON 字典中访问该数组。

这是我的 Swift 对象 = StarWarsPeople 的定义

class StarWarsPeople: Decodable {

    var name: String?
    var height: String?
    var weight: String?
    var hair_color: String?
    var skin_color: String?
    var eye_color: String?
    var birth_year: String?
    var gender: String?
}

这是我的 APIClient 类:

class StarWarsPeopleAPIClient
{
    class func getStarWarsPeopleInformation (page: Int, completion:@escaping ([StarWarsPeople])-> ()) throws {

        let starWarsPeopleURL = "https://swapi.co/api/people/?page=\(page)"

        let convertedStarWarsPeopleURL = URL(string: starWarsPeopleURL)

        guard let unwrappedConvertedStarWarsPeopleURL = convertedStarWarsPeopleURL else { print("unwrappedConvertedStarWarsPeopleURL did not unwrap"); return}

        let request = URLRequest(url: unwrappedConvertedStarWarsPeopleURL)

        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in

            guard let unwrappedData = data else { print("unwrappedData did not unwrap"); return}

            do {
                let starWarsPeopleDataArray = try JSONDecoder().decode([StarWarsPeople].self, from: unwrappedData)

                completion(starWarsPeopleDataArray)
            }
            catch let error {
                print("Error occured here: \(error.localizedDescription)")
            }
        }
        task.resume()
    }

}

这是我的 Json,它是我想要访问的结果数组,它是一个字典数组,我需要对其进行迭代以创建我的 StarWarsPeople 对象。

{
    "count": 87,
    "next": "url",
    "previous": null,
    "results": [
        {
            "name": "Luke Skywalker",
            "height": "172",
            "mass": "77",
            "hair_color": "blond",
            "skin_color": "fair",
            "eye_color": "blue",
            "birth_year": "19BBY",
            "gender": "male",
            "homeworld": "url",
            "films": [
                "url",
                "url",
                "url",
                "url",
                "url"
            ],
            "species": [
                "url"
            ],
            "vehicles": [
                "url",
                "url"

最佳答案

请阅读 JSON。你忽略了封闭的对象

struct Root: Decodable {
    let count: Int
    let next: URL?
    let previous: URL?
    let results : [StarWarsPeople]
}


struct StarWarsPeople: Decodable {

    private enum CodingKeys: String, CodingKey { 
        case name, height, mass
        case hairColor = "hair_color", skinColor = "skin_color"
        case eyeColor = "eye_color", birthYear = "birth_year", gender
    }

    let name: String
    let height: String
    let mass: String
    let hairColor: String
    let skinColor: String
    let eyeColor: String
    let birthYear: String
    let gender: String
}

...
let root = try JSONDecoder().decode(Root.self, from: unwrappedData)
let starWarsPeopleDataArray = root.results
...

注意事项:

  • 一个结构就足够了。
  • snake_cased 键映射到 camelCased 属性。
  • 在几乎所有情况下,属性都可以声明为常量 (let)。
  • 不要示意性地将所有属性声明为可选。仅将那些对应的键可以缺失或值为 null 的选项声明为可选。

关于arrays - 在 Swift 4 中使用 decodable 访问嵌入式 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49521131/

相关文章:

c++ - 为什么我的程序不从文件中将字符输入二维数组?

Javascript:为什么这段代码会立即迭代直到数组的最后一个值?

c++ - 检查数组中元素的相等性 - C++

ios - 与 Cocoapods 的混合语言框架

ios - UITableViewCell 忽略自动布局

ios - 在嵌套闭包中声明 weak

javascript - 返回 JavaScript 数组中具有最低值的对象

javascript - Angular 如何将本地镜像引用到 JSON 对象中

javascript - Google 图表堆叠条形图的 JSON 格式

javascript - 如何在javascript中对两个对象和数组进行映射