Swift 在结构数组中解码嵌套的JSON REST Api响应
我试图将in的响应解析为Swift 在结构数组中解码嵌套的JSON REST Api响应,swift,rest,swiftui,Swift,Rest,Swiftui,我试图将in的响应解析为列表,但由于嵌套的响应结构而不是扁平的响应,我似乎无法让它工作 这是我的ContentView: struct ContentView: View { private let charactersURL = URL(string: "https://swapi.dev/api/people/")! @State private var characters: [Character] = [] var body: some View {
列表
,但由于嵌套的响应结构而不是扁平的响应,我似乎无法让它工作
这是我的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()
}
}
我有一个字符响应
结构:
struct CharactersResponse {
let count: Int
let next: String
let previous: NSNull
let results: [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
}
和字符
结构:
struct CharactersResponse {
let count: Int
let next: String
let previous: NSNull
let results: [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
}
我得到的错误是,类型“Data”的值没有成员“results”
,但我不确定如何修复它,以便将字符响应
结果解析到字符
结构的数组中
您将原始数据和反序列化结构混为一谈 替换
if let charactersResponse = try? JSONDecoder().decode([Character].self, from: data.results) { ...
与
并在字符响应
struct CharactersResponse : Decodable { ...
您还可以将NSNull
替换为预期类型的可选项
永远不要在
JSONDecoder
上下文中尝试?<代码>捕获潜在错误并打印它
do {
let charactersResponse = try JSONDecoder().decode(CharactersResponse.self, from: data) { ...
} catch { print(error) }
您需要使
CharactersResponse
可解码,并使用jsondeconder()对其进行解码。解码(CharactersResponse.self,
谢谢!如果我改为使用do
我会在其自身初始值中使用变量:do{let CharactersResponse=try jsondeconder()。解码(CharactersResponse.self,from:data){withAnimation{self.characters=CharactersResponse.results}}}catch{print(error)}
我不熟悉SwiftUI。可能withAnimation
表达式位于错误的位置