【问题标题】:Swift: Unable to parse JSON response to modelSwift:无法解析对模型的 JSON 响应
【发布时间】:2019-07-19 17:58:55
【问题描述】:

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

{
   "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
       }
     }

我收到错误:

错误:操作无法完成。对象映射器失败 序列化响应。

我尝试使用 postman 调用 api,但它在 Postman 中工作正常。

【问题讨论】:

  • print("error: (error)") 而不是它的localizedDescription?它可能会提供更多信息。
  • @Larme 出现错误 Error Domain=com.alamofireobjectmapper.error Code=2“ObjectMapper 无法序列化响应。” UserInfo={NSLocalizedFailureReason=ObjectMapper 未能序列化响应。}
  • 您的响应中可能有一些值为空或未定义的值
  • @Larme 或简单的print("Error:", error)
  • @ShivJaiswal 忘记了对象映射器。你应该使用 Swift 4 Codable 协议

标签: json swift alamofire objectmapper


【解决方案1】:

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

【讨论】:

  • 然后尝试给你的变量一个默认值var cash: Int? = 0var cashExpireAt: String? = ""等等。结果中最有可能的字段之一是nil@ShivJaiswal
  • 您能否发布您如何替换当前变量实现以匹配默认值?我猜其中一个值为空或 null,因此如果它没有默认值,它将无法序列化。请更新代码,看看我们能做什么,如果仍然出现同样的错误,请重试。
  • @ShivJaiswal 请也尝试使用responseJSON 而不是responseObject,因为您期望json 作为由字典键值类型组成的响应。
  • @ShivJaiswal 还有:var data: WalletData()
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多