You need to enable JavaScript to run this app. 如何在Swift与Objc混编项目中结合AFNetworking使用Codable解析数据
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 21:06:05