Swift 在结构数组中解码嵌套的JSON REST Api响应

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 {

我试图将in的响应解析为
列表
,但由于嵌套的响应结构而不是扁平的响应,我似乎无法让它工作

这是我的
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
表达式位于错误的位置