我正在制作一个基础的IOS应用程序,基于苹果的“应用程序开发与Swift”的书。我的应用程序使用Marvel API。我想找到英雄的名字和描述。
与API的连接完全正常,并且已经过多次测试。这个问题与此无关。
我的问题是,JSON结果嵌套了3次,我不知道如何在Swift 4中实现这一点。
下面是一个1英雄的JSON结果的例子。所有英雄都可以在“结果”中找到。
我的代码有一个致命错误:
Swift.DecodingError.keyNotFound(CodingKeys(stringValue:“结果”,intValue: 0)
let jsonDecoder = JSONDecoder()
let task = URLSession.shared.dataTask(with: url) { (data,
response, error) in
try! jsonDecoder.decode(CharactersContainer.self,
from: data!) //error here
if let data = data,
let char = try? jsonDecoder.decode(CharactersContainer.self, from: data) {
print(char.characters)
print("succes")
} else {
print("failed")
}
}下面是我的模特们:
import Foundation
struct Character: Codable {
var name: String
var description: String
//var url: Image
enum CodingKeys: String, CodingKey {
case name
case description
//case url = "thumbnail"
}
init(from decoder: Decoder) throws {
let valueContainer = try decoder.container(keyedBy: CharactersContainer.CodingKeys.self).nestedContainer(keyedBy: Characters.CodingKeys.self, forKey: .characters).nestedContainer(keyedBy: Character.CodingKeys.self, forKey: .characters)
if let name = try valueContainer.decodeIfPresent(String.self, forKey: CodingKeys.name) {
self.name = name
} else {
self.name = ""
}
if let description = try valueContainer.decodeIfPresent(String.self, forKey: CodingKeys.description) {
self.description = description
} else {
self.description = ""
}
// self.url = try valueContainer.decode(URL.self, forKey: CodingKeys.url)
}
}
struct Characters : Decodable{
var characters : [Character]
enum CodingKeys: String, CodingKey {
case characters = "data"
}
}
struct CharactersContainer : Decodable {
var characters : Characters
//var total: Int
enum CodingKeys: String, CodingKey {
case characters = "results"
//case total
}
}我不知道自己做错了什么,因为我看到了一些做同样事情的例子。
谢谢您的入住!
发布于 2018-11-22 17:02:14
在JSON中,data包含results键。按照设置密钥的方式,它期望results包含一个data键。
CharactersContainer.CodingKeys.characters应该是"data"
Characters.CodingKeys.characters应该是"results"
编辑:
Character还有另一个问题。它试图获得一个由CharactersContainer.CodingKeys.self键决定的包含,但可能应该是Character.CodingKeys.self。
https://stackoverflow.com/questions/53435448
复制相似问题