如何在Swift与Objc混编项目中结合AFNetworking使用Codable解析数据
解决AFNetworking返回Data格式响应适配Swift Codable解析的方案
方案1:修改全局响应序列化器(推荐)
AFNetworking默认使用AFJSONResponseSerializer会自动把响应解析为NSDictionary/NSArray类型,替换为AFHTTPResponseSerializer即可直接返回原始二进制数据:
- Objective-C 配置代码:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 替换为原始Data响应序列化器 manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init]; // 根据业务需要配置可接受的响应内容类型 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil];
- Swift 配置代码:
let manager = AFHTTPSessionManager() manager.responseSerializer = AFHTTPResponseSerializer() manager.responseSerializer.acceptableContentTypes = Set(["application/json", "text/json", "text/javascript", "text/plain"])
配置完成后所有请求回调返回的responseObject桥接为Swift类型后就是Data,可直接传入JSONDecoder做解析。
方案2:单个请求单独配置序列化器(不影响全局逻辑)
如果项目其他模块仍需要返回解析好的字典类型,可仅对需要Codable解析的请求临时修改序列化器:
// 保存原有全局序列化器 id originalSerializer = manager.responseSerializer; // 临时替换为Data序列化器 AFHTTPResponseSerializer *dataSerializer = [AFHTTPResponseSerializer new]; dataSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil]; manager.responseSerializer = dataSerializer; [manager GET:@"请求接口地址" parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 恢复原有序列化器 manager.responseSerializer = originalSerializer; // responseObject 即为NSData类型,可直接用于解析 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { manager.responseSerializer = originalSerializer; // 错误处理逻辑 }];
方案3:NSDictionary转Data解析(备选方案)
如果无需修改AFNetworking原有配置,也可以在Swift端把返回的字典二次序列化为Data再解析:
guard let jsonDict = responseObject as? [String: Any] else { return } do { let jsonData = try JSONSerialization.data(withJSONObject: jsonDict) let targetModel = try JSONDecoder().decode(你的Codable模型类型.self, from: jsonData) } catch { print("解析失败: \(error)") }
该方案会多执行一次JSON序列化/反序列化操作,性能略低于直接获取原始Data,适合临时适配场景。
内容的提问来源于stack exchange,提问作者Subso
相关产品推荐
相关产品推荐

