ios - 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))
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"
}
}
{
"status": true,
"code": 200,
"message": null,
"result": {
"shop_name": "AAAAAA",
"shop_image": "https://......",
"maintenance_date": "",
"maintenance_content": "",
"shop_detail_url": "/store/detail/111113/42"
}
}
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)
}
}
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()
}
}
}
解决方案
推荐阅读
- mule - Mule 3 到 Mule 4 错误类型和 http 状态的错误处理查询
- javafx - JavaFX: Snakes And Ladders - 在 GridPane 中表示蛇和梯子图像
- ejabberd - ejabberd 中的用户存储
- python - Exchangelib 流通知句柄事件
- node.js - Ghostscript 命令行 - 将参数传递给包含的文件
- cordova - Ionic 3-“ionic cordova build android”构建多个 apk
- ios - 使用 twitter swift 4 登录时出错
- azure - 天蓝色函数上的 TaskCanceledException(服务总线触发器)
- javascript - 加粗文本中的特定单词 - React Native?
- c# - 发布长内容会引发“抱歉,我的机器人代码有问题”