Swift中AFError解析失败求助:含重音请求无法正常解码JSON
解决AFNetworking中带重音字符请求的JSON解码失败问题
问题根源
当请求包含重音字符(如é、ñ、à等)时,若字符编码处理不当,会导致服务器接收到的请求格式异常,返回非合法JSON响应,最终触发ResponseSerializationFailureReason错误,提示"The given data was not valid JSON."。
具体解决步骤
1. 强制请求使用UTF-8编码
AFNetworking默认参数编码可能对重音字符支持不足,手动指定UTF-8编码确保字符正确传输:
// Objective-C AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
// Swift let manager = AFHTTPSessionManager() manager.requestSerializer.stringEncoding = .utf8
2. 修正请求头Content-Type设置
确保请求头明确指定UTF-8编码,避免服务器解析请求时出现编码偏差:
// Objective-C [manager.requestSerializer setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
// Swift manager.requestSerializer.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
3. 自定义响应序列化器,强制UTF-8解码
部分服务器返回的响应未指定正确编码,导致AFNetworking解码失败,自定义序列化器覆盖默认逻辑:
// Objective-C AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer]; serializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", nil]; serializer.stringEncoding = NSUTF8StringEncoding; manager.responseSerializer = serializer;
// Swift let serializer = AFJSONResponseSerializer() serializer.acceptableContentTypes = Set(["application/json", "text/json", "text/javascript", "text/plain"]) serializer.stringEncoding = .utf8 manager.responseSerializer = serializer
4. 调试原始响应数据定位问题
如果以上步骤无效,先获取原始响应数据,确认是服务器返回内容异常还是客户端解码问题:
// Objective-C manager.responseSerializer = [AFHTTPResponseSerializer serializer]; [manager GET:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSData *data = (NSData *)responseObject; NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"原始响应:%@", responseString); // 手动尝试解码 NSError *error; id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if (error) NSLog(@"解码错误:%@", error); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"请求失败:%@", error); }];
// Swift manager.responseSerializer = AFHTTPResponseSerializer() manager.get(urlString, parameters: parameters, progress: nil) { task, responseObject in guard let data = responseObject as? Data else { return } if let responseString = String(data: data, encoding: .utf8) { print("原始响应:\(responseString)") } do { let json = try JSONSerialization.jsonObject(with: data) print("解码结果:\(json)") } catch { print("解码错误:\(error)") } } failure: { task, error in print("请求失败:\(error)") }
5. 排查服务器端编码处理
若客户端设置全部正确,需确认服务器是否支持UTF-8编码,能否正确解析带重音字符的请求参数——部分服务器默认编码非UTF-8,会导致请求解析异常并返回非JSON内容。
内容的提问来源于stack exchange,提问作者David Fdez
相关产品推荐
相关产品推荐

