首页 > 解决方案 > typeMismatch:通用未知类型 jsondecoder / 可编码 / RxSwift

问题描述

使用 RxSwift 中的 map,对于插入到搜索栏中的每个字符,我调用一个 API 来获取 json 并将数据解析到表视图。但由于我更改了插入常量 API 的每个字符,而不是仅出于演示目的,因此出现此错误失败:let model: T = try JSONDecoder().decode(T.self, from: data ?? Data())

请帮助我,非常感谢

绑定错误:typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "预期解码 Array 但找到了一个字典。", underlyingError: nil))

这是我的可编码结构,用于与下面给出的 json 进行映射

struct Result: Codable {
let shopName: String
let shopImage: String
let maintenanceDate: String
let maintenanceContent: String
let shopDetailUrl: String

private enum CodingKeys: String, CodingKey {
    case shopName = "shop_name"
    case shopImage = "shop_image"
    case maintenanceDate = "maintenance_date"
    case maintenanceContent = "maintenance_content"
    case shopDetailUrl = "shop_detail_url"
}

}

struct ShopModel: Codable {
let status: Bool
let code: Int
let message: String?
let result: Result

private enum CodingKeys: String, CodingKey {
    case status
    case code
    case message
    case result = "result"
}

}

json数据

{
"status": true,
"code": 200,
"message": null,
"result": {
    "shop_name": "AAAAAA",
    "shop_image": "https://......",
    "maintenance_date": "",
    "maintenance_content": "",
    "shop_detail_url": "/store/detail/111113/42"
}

}

这是每次在搜索栏中插入字符时触发事件以调用 api 的地方

    private func configureReactiveBinding() {
    searchController.searchBar.rx.text.asObservable()
        .map { _ in CarRequest(token: "6aa86866d95414a9e469f4323b1da139f96d22d8") }
        .flatMap { request -> Observable<[ShopModel]> in
            return self.apiClient.send(apiRequest: request)
        }
        .bind(to: tableView.rx.items(cellIdentifier: cellIdentifier)) { index, model, cell in
            cell.textLabel?.text = model.result.shopImage
            cell.detailTextLabel?.text = model.result.shopName
            cell.textLabel?.adjustsFontSizeToFitWidth = true
        }
        .disposed(by: disposeBag)
}

}

发送api请求,解码json

    private let baseURL = URL(string: "https://stg.api.link-collabo.jp/api/user/myshop.json")!

func send<T: Codable>(apiRequest: APIRequest) -> Observable<T> {
    return Observable<T>.create { [unowned self] observer in
        let request = apiRequest.request(with: self.baseURL)
        let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            do {
                let model: T = try JSONDecoder().decode(T.self, from: data ?? Data())
                print(model)
                observer.onNext(model)
            } catch let error {

                observer.onError(error)
            }
            observer.onCompleted()
        }
        task.resume()

        return Disposables.create {
            task.cancel()
        }
    }
}

标签: iosswiftrx-swiftcodablejsondecoder

解决方案


推荐阅读