Swift:无法解析对模型的JSON响应

问题描述 投票:0回答:2

我从服务器获得数据响应,如下所示:

{
   "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,但它在邮递员工作正常。

json swift alamofire objectmapper
2个回答
1
投票

您是否尝试过Decodable建议使用Mappable而不是Alamofire documentation


1
投票

使用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) }
© www.soinside.com 2019 - 2024. All rights reserved.