swift - 将嵌套的 JSON REST Api 响应解码为结构数组
问题描述
我正在尝试将 https://swapi.dev/api/people/的响应解析为 aList
但由于嵌套响应结构而不是平坦响应,我似乎无法使其工作。
这是我的ContentView
:
struct ContentView: View {
private let charactersURL = URL(string: "https://swapi.dev/api/people/")!
@State private var characters: [Character] = []
var body: some View {
NavigationView {
VStack {
List {
ForEach(characters, id: \.self) { character in
NavigationLink(destination: CharacterView(character: character)) {
Text(character.name)
}
}
}
.onAppear(perform: loadCharacter)
}
.navigationBarTitle("Swapi Api Client")
}
}
private func loadCharacter() {
let request = URLRequest(url: charactersURL)
URLSession.shared.dataTask(with: request) { data, response, error in
if let data = data {
if let charactersResponse = try? JSONDecoder().decode([Character].self, from: data.results) {
withAnimation {
self.characters = charactersResponse.results
}
}
}
}.resume()
}
}
我有一个CharactersResponse
结构:
struct CharactersResponse {
let count: Int
let next: String
let previous: NSNull
let results: [Character]
}
和一个Character
结构:
struct Character: Decodable, Hashable {
let name: String
let height: Int
let mass: String
let hairColor: String
let skinColor: String
let eyeColor: String
let birthYear: String
let gender: String
let homeworld: String
let films: [String]
let species: [String]
let vehicles : [String]
let starships: [String]
let created: String
let edited: String
let url: String
}
我得到的错误是Value of type 'Data' has no member 'results'
,但我不确定如何修复它以便将其解析为结构CharactersResponse
results
数组。Character
解决方案
您正在混淆原始数据和反序列化的结构
代替
if let charactersResponse = try? JSONDecoder().decode([Character].self, from: data.results) { ...
和
if let charactersResponse = try? JSONDecoder().decode(CharactersResponse.self, from: data) { ...
Decodable
并采用CharactersResponse
struct CharactersResponse : Decodable { ...
您也可以替换NSNull
为预期类型的可选
永远不要try?
在JSONDecoder
上下文中。catch
一个潜在的错误并打印出来。
do {
let charactersResponse = try JSONDecoder().decode(CharactersResponse.self, from: data) { ...
} catch { print(error) }
推荐阅读
- abap - 以编程方式使用 GOS 对象在 MB51 中创建注释
- amazon-web-services - AWS IAM / CMK 传播时间
- c# - 将 DataGridView 从一个窗体复制到另一个窗体
- reactjs - 我可以将 redux 操作与 react 组件分开发送吗?
- python - 如何在 Python 中使用 PyQt5 绘制折线?
- java - 在套件中运行测试用例时在 XML testng 文件中出现错误
- flutter - Flutter - 如何从底部菜单导航栏的第一个标签屏幕打开第二个屏幕
- swift - 从服务器下载 tflite 模型,而不是使用 Swift 中资产文件夹中的模型
- python - Is it ever okay to catch a generic exception in Python?
- android - Jetpack Composable 不会对更改做出反应