我想将从请求中收到的数据写入数组,然后通过列表显示它

以下是我的json文件的 struct

struct DataRespons: Codable {
    
    let data: [String]
    let status: String
}

struct UserRespons: Codable {
    
    let status: String
    let data: UserData
}

struct UserData: Codable, Identifiable {
    
    let id: String
    let firstName: String
    let lastName: String
    let age: Int
    let gender: String
    let country: String
}

这是我的JSON请求和解码类

import Foundation

@MainActor
class NetworkModel: ObservableObject {
    
    @Published var listId: [String] = []
    var statusList = ""
    var statusUser = ""
    var temp = ""
    var user: [UserData] = []     // here I am not sure if this type Array
    @Published var userData = UserRespons(status: "??", data: UserData(id: "???", firstName: "???", lastName: "??", age: 4, gender: "???", country: "???"))

这个函数用于接收带有链接的信件,我应该请求这些链接

func getList() {
        guard let url = URL(string: "https://opn-interview-service.nn.r.appspot.com/list") else { fatalError("Missing URL") }
        var request = URLRequest(url: url)
        request.addValue("bearer \(token)", forHTTPHeaderField: "Authorization")
        let dataTask = URLSession.shared.dataTask(with: request) { (data, response, error) in
            if let error = error {
                print("Requst error",error)
                return
            }
            guard let response = response as? HTTPURLResponse else { return }
            if response.statusCode == 200 {
                guard let data = data else { return }
                DispatchQueue.main.async { [self] in
                    do {
                        let decoded = try JSONDecoder().decode(DataRespons.self, from: data)
                        self.listId = decoded.data
                        self.statusList = decoded.status
                        
                        for i in self.listId.indices {
                            print("This is id[\(i)] = \(listId[i])")
                            getUser(url: "\(listId[i])")
// #MARK: NEED HERE HELP          user.append(.init(id: <#T##String#>, firstName: <#T##String#>, lastName: <#T##String#>, age: <#T##Int#>, gender: <#T##String#>, country: <#T##String#>))
                        }
                    } catch let error{
                        print("Error decode",error)
                    }
                }
            }
        }
        dataTask.resume()
    }

我希望将来自请求的数据添加到空数组中,以便可以在列表中显示这些数据

对数据用户进行解码的功能

    func getUser(url: String) {
        guard let url = URL(string: "https://opn-interview-service.nn.r.appspot.com/get/\(url)") else { fatalError("Missing URL") }
        var request = URLRequest(url: url)
        request.addValue("bearer \(token)", forHTTPHeaderField: "Authorization")
        let dataTask = URLSession.shared.dataTask(with: request) { (data, response, error) in
            if let error = error {
                print("Requst error",error)
                return
            }
            guard let response = response as? HTTPURLResponse else { return }
            if response.statusCode == 200 {
                guard let data = data else { return }
                DispatchQueue.main.async { [self] in
                    do {
                        let decoded = try JSONDecoder().decode(UserRespons.self, from: data)
                        self.userData = decoded
                        self.statusUser = decoded.status
                        print("UserData: name = \(userData.data.firstName) Lastname = \(userData.data.lastName) gender = \(userData.data.gender)")


                    } catch let error{
                        print("Error decode",error)
                    }
                }
            }
        }
        dataTask.resume()
    }

我不知道如何将所有数据放入数组中

推荐答案

首先,迭代索引很麻烦,请替换

for i in self.listId.indices {
    print("This is id[\(i)] = \(listId[i])")
    getUser(url: "\(listId[i])")

}

使用

for id in self.listId {
    print("This is \(id)")
    getUser(url: id)
}

但这不是追加用户数据的正确位置.在getUser分钟内完成.但首先将数组声明为@Published(并以复数形式)

 @Published var users = [UserData]()

并删除属性userData,因为它不是必需的.

 @Published var userData = UserRespons(status: "??", data: UserData(id: "???", firstName: "???", lastName: "??", age: 4, gender: "???", country: "???"))

Now replace the decoding part in getUser 使用

let decoded = try JSONDecoder().decode(UserRespons.self, from: data)
self.statusUser = decoded.status
users.append(decoded.data)

print("UserData: name = \(decoded.data.firstName) Lastname = \(decoded.data.lastName) gender = \(decoded.data.gender)")

我建议搬到async/await岁.它的代码要少得多,而且它会自动切换到主线程.

Json相关问答推荐

Jolt将键和值转换为单独的数组集

将JSON输入子数组转换为字符串顺序列表输出

如何使用PlayWriter循环访问JSON对象

褐煤面积图中的分选问题

使用JQ从jsonl文件中删除具有匹配键/值的行

解析Ansible AWS ec2_security_group中的json以提取安全组ID

如何使用 JOLT 将带有列表的 JSON 项目取消列出为多个项目?

如何在 Apache NiFi 中使用 JoltTransformJson 删除流文件或具有空字段的整个对象?

使用本地 JSON api react TS Axios

如何从字符串中创建一个逗号分隔的列表,由 API 中的 JSON 对象内的编号空格分隔?

我无法将来自 API 的数据显示到 FlatList 中,但我在 console.log 中看到了它.问题是什么?

自定义将 struct 解组为切片映射

PowerShell - JSON/PsCustomObject - 为什么我的数组被扁平化为一个对象?

如何使用 gson 调用默认反序列化

Newtonsoft Json 将值 {null} 转换为类型System.Int32时出错

如何在java中比较来自JsonObject的空值

Spring MVC:不反序列化 JSON 请求正文

如何按键查找特定的 JSON 值?

在 HTML 数据属性上添加 JSON 是不是很糟糕?

如何在 React js 中解析本地 JSON 文件?