Ошибка сериализации ответа, как это исправить?

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