我正在try 创建一个CRM应用程序,为此,我在我的树莓PI上创建了一个数据库,并使用PHP在URL上创建了JSON结果.

现在,我已经在Swift中创建了下面的网络管理器,但Catch中结尾处的validData错误一直被抛出.我做错了什么?

import Foundation

final class NetworkManager {
    static let shared = NetworkManager()
    static let baseURL = ""
    private let buyersURL = baseURL + ""
    
    private init(){}
    
    func getBuyers(completed: @escaping (Result<[Buyer], CRMError>) -> Void) {
        guard let url = URL(string: buyersURL) else {
            completed(.failure(.invalidURL))
            return
        }
        let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, response, error in
            if let _ = error {
                completed(.failure(.unableToComplete))
                return
            }
            
            guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
                completed(.failure(.invalidResponse))
                return
            }
            
            guard let data = data else {
                completed(.failure(.invalidData))
                return
            }
            
            do {
                let decoder = JSONDecoder()
                let decodedResponse = try decoder.decode(BuyerResponse.self, from: data)
                completed(.success(decodedResponse.request))
            }  catch {
                completed(.failure(.invalidData))
            }
        }
        task.resume()
    }
}

以下是URL上的JSON的结果

JSON result

以下是我的买家 struct :

import Foundation

struct Buyer: Codable, Identifiable, Hashable{
    let id: Int
    let user_id: Int
    let name: String
    let email: String
    let country: String
    let phone: String
    let second_phone: String
    let whishes: String
    let budget: String
    let timing: String
    let fase: String
    let media: String
    let plans: String
    let extra: String
    let hot: Int
}

struct BuyerResponse : Codable {
    let request: [Buyer]
}

这就是我所说的吸引买家的观点:

struct BuyersView: View {
    @StateObject var viewModel = BuyersViewModel()

    @State var path = NavigationPath()
    
    @State private var buyers: [Buyer] = []
    
    var body: some View {
        NavigationStack(path: $path) {
            VStack{
                CategoryView(categories: viewModel.fases, currentSelection: $viewModel.currentFase)
                HStack{
                    Spacer()
                    NavigationLink("Add buyer", value: 0)
                        .padding()
                }
                List(buyers){ buyer in
                    BuyerCellView(buyer: buyer)
                }
            }
//            .navigationDestination(for: Int.self) { _ in
//                AddBuyerView(path: $path, fases: viewModel.fases, medias: $viewModel.media)
//            }.navigationDestination(for: Buyer.self) { buyer in
//                BuyerDetailView(buyer: buyer)
//            }
        }.onAppear{
             getBuyers()
        }
    }
    
    func getBuyers() {
        NetworkManager.shared.getBuyers { result in
            DispatchQueue.main.async {
                switch result {
                case .success(let buyers):
                    self.buyers = buyers
                case .failure(let error):
                    print(error.localizedDescription)
                }
            }
        }
    }
}

我判断了JSON上的变量和Buyer的 struct 是相同的,但错误一直在发生,我只是希望变量Buyers从JSON返回买家列表.

我在视频的大约6个小时里按照https://www.youtube.com/watch?v=b1oC7sLIgpI&t=22362s的教程进行了

感谢您提前提供帮助

推荐答案

BuyerResponse的内部,您说JSON应该是这样的:

{ request: [{buyer 1 properties}, {buyer 2 properties}] }

但从你的截图来看,回应如下:

    [{buyer 1 properties}, {buyer 2 properties}]

在您的PHP脚本内部,您应该调整响应,以便在列表开始之前获得request: .这应该会奏效.

另一种方法是改变这条线

let decodedResponse = try decoder.decode(BuyerResponse.self, from: data)

let decodedResponse = try decoder.decode([Buyer].self, from: data)

这样,您就可以告诉解码器,它得到的是一个没有任何东西的Buyer的列表.

通常,如果您在该位置收到错误,则意味着您收到的数据与您指定的数据 struct 不匹配.

A good way 至 approach this is 至 just create a model struct with only one property and check whether that works. Then add another property, etc. If it doesn't work: print the error you receive and that will tell you at what line of the JSON there is something unexpected.

Json相关问答推荐

如何使用Aeson解码带有Unicode字符的JSON文件?

Terraform迭代JSON文件以获取键值对

需要有关在Ffltter应用程序中解码JSON的帮助;未处理的异常:类型不是类型转换中类型的子类型

使用 Redis 作为键值存储

如何将具有相同 struct 的多个JSON文件中的对象数组合并成一个数组?

将 GEOSwift.JSON 转换为 Swift 中的 struct

是否可以在有条件的情况下将 json 对象转换为 JOLT 中的数组?

UTF-8 字符编码之战 json_encode()

解析包含换行符的 JSON

如何使用 Newtonsoft.Json 反序列化 JSON 数组

如何从 JSON 对象中获取日期

如何一次加载无限滚动中的所有条目以解析python中的HTML

Laravel5 Json 获取文件内容

Android JSON 库的性能和可用性比较

在 Postgres 中向 JSON 对象添加元素

如何将 mysqli 结果转换为 JSON?

在android中使用GSON解析带有动态key和value的JSON

通过 JSON 发送 64 位值的公认方式是什么?

JSON 和 BSON 哪个更轻量级?

XML vs YAML vs JSON