You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:25:20