gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 10:43:18 25 4
gpt4 key购买 nike

我正在尝试访问一个特定的嵌入式字典数组来创建我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com