Swift: невозможно проанализировать ответ JSON на модель - PullRequest
0 голосов
/ 26 февраля 2019

Я получаю ответ от сервера, как показано ниже:

{
   "success": true,
   "data": {
      "cash": 0,
      "newCash": 0,
      "cashExpireAt": "2019-02-26T16:01:35.6451887+08:00",
      "isEnabled": false,
      "low_balance": true
    }
}

// Ниже приведен класс модели

class WalletBalance: Mappable {

   var isSuccess               : Bool! = false
   var data                    : WalletData?

   required init?(map: Map) {
      //Code here
   }

   func mapping(map: Map) {
      isSuccess <- map["success"]
      data <- map["data"]
   }
}

class WalletData: Mappable {

   var cash                     : Int! = 0
   var newCash                  : Int! = 0
   var cashExpireAt             : String! = ""
   var isEnabled                : Bool! = false
   var low_balance              : Bool! = false

   required init?(map: Map) {
      //Code here
   }

   func mapping(map: Map) {
      cash <- map["cash"]
      newCash <- map["newCash"]
      cashExpireAt <- map["cashExpireAt"]
      isEnabled <- map["isEnabled"]
      low_balance <- map["low_balance"]
   }
}

// Ниже приведен код для вызова сервера api

Alamofire.request(url!, method: .get, parameters: nil, encoding: URLEncoding.default, headers: walletHeaders)
    .validate(statusCode: 200..<600)
    .responseObject { (response: DataResponse<WalletBalance>) in
         switch response.result {
         case .success:
            if response.result.value == nil {
               //Code here
            } else {
               completion(response.result.value!)
            }
         break
         case .failure(let error):
            print("error: ", error.localizedDescription)
         break
       }
     }

Я получаю ошибку:

ошибка: операция не может быть завершена.ObjectMapper не смог сериализовать ответ.

Я пытался вызвать api, используя почтальон, но в Postman он работает нормально.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Используйте Decodable.Это намного проще, эффективнее, встроено и генерирует гораздо меньше кода.Дата может быть декодирована непосредственно как Date

let jsonString = """
{
  "success": true,
  "data": {
    "cash": 0,
    "newCash": 0,
    "cashExpireAt": "2019-02-26T16:01:35.6451887+08:00",
    "isEnabled": false,
    "low_balance": true
  }
}
"""

struct Balance : Decodable {
    let success : Bool
    let data : Wallet
}

struct Wallet: Decodable {
    let cash, newCash : Int
    let cashExpireAt : Date
    let isEnabled, lowBalance : Bool
}


let data = Data(jsonString.utf8)
let decoder = JSONDecoder()

let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
decoder.dateDecodingStrategy = .formatted(dateFormatter)
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
    let result = try decoder.decode(Balance.self, from: data)
    print(result)
} catch { print(error) }
0 голосов
/ 26 февраля 2019

Вы пытались использовать Decodable вместо Mappable, как это предлагается в документации Alamofire ?

...