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