Swift 如何通过点击API端点来解码JSON数据?

Swift 如何通过点击API端点来解码JSON数据?,swift,swiftui,Swift,Swiftui,我目前正在使用SwiftUI开发一个应用程序 我想在遇到API端点时解码JSON数据 但是我的密码不太好用 我怎样才能解决我的问题 这里是我访问端点时的JSON数据 https://sample.com/api/test/ *我肯定检查了这个端点是否工作良好 [ { "id": 1, "user": 1, "name": "AAA" }, {

我目前正在使用SwiftUI开发一个应用程序

我想在遇到API端点时解码JSON数据

但是我的密码不太好用

我怎样才能解决我的问题


这里是我访问端点时的JSON数据

https://sample.com/api/test/

*我肯定检查了这个端点是否工作良好

[
    {
        "id": 1,
        "user": 1,
        "name": "AAA"
    },
    {
        "id": 2,
        "user": 1,
        "name": "BBB"
    },
    {
        "id": 3,
        "user": 1,
        "name": "CCC"
    },
    {
        "id": 4,
        "user": 1,
        "name": "DDD"
    },
    {
        "id": 5,
        "user": 1,
        "name": "EEE"
    }
]

代码如下:

JsonModel.swift

import Foundation

struct Results: Codable {
    var infos:[Infos]
}

struct Infos: Codable {
    var id: Int
    var user: Int
    var name: String
}
AppState.swift

*我在注释时出错

import SwiftUI
import Foundation
import Combine


class AppStates: ObservableObject {
    
    @Published var infos:Infos?
    @Published var results:Results?

    func hitAPI() {
        
        let endpoint: String = "https://sample.com/api/test/"
        
        guard let url = URL(string: endpoint) else {
            print("Error: cannot create URL")
            return
        }
        var urlRequest = URLRequest(url: url)
        urlRequest.addValue("token xxxxxxxxxxxxxxxxxxxxxx", forHTTPHeaderField: "authorization")
        
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)
        
        let task = session.dataTask(with: urlRequest) {
            (data, response, error) in
            guard error == nil else {
                print("error calling GET")
                print(error!)
                return
            }
            guard let responseData = data else {
                print("Error: did not receive data")
                return
            }
            DispatchQueue.main.async {
                do{
                    let results = try JSONDecoder().decode(Results.self, from: responseData)
                    print(results)
                }catch{
                    print("Error: did not decode") // I have an error here
                    return
                }
            }
        }
        task.resume()
    }
}
霍姆·斯威夫特

import SwiftUI

struct Home: View {
    @EnvironmentObject var appState: AppState
    
    var body: some View {
        VStack{
            Button(action: {
                appState.hitAPI()
            }) {
                Text("hit API")
            }.padding()
        }
    }
}

struct Home: PreviewProvider {
    static var previews: some View {
        Home()
    }
}


Xcode:Version 12.0.1

打印(“错误:未解码”)//我在这里有一个错误
=>
打印(“错误:未解码:\(错误)”)//我在这里有一个错误
,然后重新测试。然后,您应该看到JSON中没有
infos
,没有
plant\u name
JSONDecoder().解码(Results.self
=>
JSONDecoder().解码([Infos].self
plant_name
=>
name
,或在编码键中指定,但仍然应该是
plantName
(camelcase)@Larme,对不起,我写错了名字,编辑了名字。JSON数据和结构信息中的名字是一样的。不过,除了
plantName
,其余的都可以。JSON上没有“Infos”。这个级别不存在。打印错误,你会看到。@Larme,我把代码改成
JSONDecoder()。解码([Infos].self,
现在运行良好!!感谢您的帮助,