typeMismatch:通用未知类型jsondecoder /可编码/ RxSwift

时间:2019-12-18 05:07:34

标签: ios swift rx-swift codable jsondecoder

使用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进行解码,但找到了一个字典。”,底层错误:无))

This's my codable struct for mapping with json given below

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 data

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

}

This is where events triggered to call api everytime a character inserted in searchbar

    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)
}

}

send api request, and decode 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()
        }
    }
}

0 个答案:

没有答案