#json #swift #alamofire #promisekit
#json #swift #alamofire #promisekit
Вопрос:
Я пытаюсь декодировать данные json, но он выдает ошибку:
[] nw_protocol_get_quic_image_block_invoke dlopen libquic failed responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.decodingFailed(error: Swift.DecodingError.typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))))
Я думаю, я сделал это правильно, я также проверил несоответствие типов, выглядит правильно, но не мог понять, почему я все еще получаю ошибку. .
вот как выглядит мой ответ на данные json:
[
{
"id": 1,
"name": "BlackJet",
"type": "Silk",
"quantity": "100"
},
[
{
"id": 2,
"name": "Toto",
"type": "Leather",
"quantity": "10"
},
...,
]
вот мои структурные данные:
import Foundation
struct Response<T: Codable>: Codable {
var data: [T]?
}
struct MyData: Codable {
var id: Int
var name: String
var type: String
var quantity: Int
}
и моя функция serverCommunicator:
static func getData() -> Promise<Response<MyData>> {
let decoder = JSONDecoder()
return Promise { seal in
AF.request(API.getData, method: .get, parameters: .none).responseDecodable(of: Response<MyData>.self, decoder: decoder) { response in
switch response.result {
case .success(let val):
return seal.fulfill(val)
case .failure(let err):
return seal.reject(err)
}
}
}
}
и моя функция ApiCall внутри VC загрузилась:
func getData() {
ServerCommunicator.getData().done { response -> Void in
guard response.data != nil, let data = response.data else {
print("Data could not be obtained.. .")
return
}
self.data = data
}.catch { (err) in
print(err)
}
}
ПРИМЕЧАНИЕ: в моем API не существует заголовков или параметров api//
Комментарии:
1. В
data
вашем JSON нет ключа.static func getData() -> Promise<Response<MyData>>
=>static func getData() -> Promise<[MyData]>
? иresponseDecodable(of: Response<MyData>.self
=>responseDecodable(of: [MyData].self
?2. Я решил это .. спасибо за вашу помощь ..)
3. Я тоже скоро опубликую свое обновленное решение … это была крошечная ошибка st * pid .. lol
4. кстати, я думаю, что проблемы все еще сохраняются, я думал, что решил проблемы, но на самом деле, похоже, я этого не сделал.. в чем может быть проблема ..?
Ответ №1:
Сначала вам нужно изменить тип quantity
from Int
на String
в соответствии с ответом,
struct MyData: Codable {
var id: Int
var name: String
var type: String
var quantity: String
}
Затем вам нужно будет изменить сигнатуру getData
метода, как показано ниже,
static func getData() -> Promise<[MyData]> {
let decoder = JSONDecoder()
return Promise { seal in
AF.request(API.getData, method: .get, parameters: .none).responseDecodable(of: [MyData].self, decoder: decoder) { response in
switch response.result {
case .success(let val):
return seal.fulfill(val)
case .failure(let err):
return seal.reject(err)
}
}
}
}