Swift 4.1中AlamofireObjectMapper序列化失败问题求助
问题原因分析与解决方案
嘿,我一眼就揪出你遇到的问题啦!这个序列化错误的核心原因是API返回格式和代码期望的解析类型不匹配,具体细节如下:
1. 响应结构不匹配(最关键问题)
你的API返回的是单个Integrations对象:
{ "id": 120, "type": "Integration", "active": true }
但你在请求代码里用了responseArray方法——这个方法是专门用来解析JSON数组的(比如[{"id":120,...}, {...}]这种数组包裹的格式)。ObjectMapper尝试把单个对象强行转成数组,自然会失败,所以抛出了ObjectMapper failed to serialize response.的错误。
对应解决方案(二选一)
- 如果API本来就应该返回单个对象:把
responseArray改成responseObject,同时调整completion的参数类型:static func getUberIntegration(completion: @escaping (Integrations?) -> ()) { let url = "\(Url.baseURL())/integrations" let headers = Headers.authorization() Alamofire.request(url, headers: headers).responseObject { (response: DataResponse<Integrations>) in let integration = response.result.value print(integration ?? "No data returned") completion(integration) } } - 如果API应该返回多个对象:需要后端调整返回格式,把单个对象包裹在数组里,比如:
[ { "id": 120, "type": "Integration", "active": true } ]
2. 额外的类型匹配优化建议
你的Integrations模型里id是Int32类型,但JSON返回的id是标准的Int类型(120)。虽然ObjectMapper通常能自动处理这种小范围类型转换,但为了避免潜在的意外问题,建议把模型里的id类型改成Int:
class Integrations: Object, Mappable { @objc dynamic var id: Int = 0 // 从Int32改为Int @objc dynamic var type: String = "" @objc dynamic var active: Bool = false override static func primaryKey() -> String? { return "id" } required convenience init?(map: Map) { self.init() } func mapping(map: Map) { id <- map["id"] type <- map["type"] active <- map["active"] } }
内容的提问来源于stack exchange,提问作者user7189581
相关产品推荐
相关产品推荐

