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

使用AFNetworking时,如何阻止AFJSONRequestSerializer转义JSON中的斜杠/?

解决AFJSONRequestSerializer自动转义斜杠的问题

嘿,这个场景我之前开发时也碰到过!AFJSONRequestSerializer 默认会遵循 JSON 规范对特殊字符做转义处理,其中就包括把 / 转成 \/——虽然这在标准里是合法的,但有些后端服务可能对这种转义不兼容,所以我们可以通过调整序列化器的配置来解决这个问题。

针对 iOS 10+ 的最优解决方案

从 iOS 10 开始,NSJSONSerialization 新增了 NSJSONWritingWithoutEscapingSlashes 选项,专门用来禁止斜杠的自动转义。你只需要给 AFJSONRequestSerializer 设置这个选项即可:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFJSONRequestSerializer *jsonSerializer = [AFJSONRequestSerializer serializer];
// 设置序列化选项:不转义斜杠
jsonSerializer.writingOptions = NSJSONWritingWithoutEscapingSlashes;
manager.requestSerializer = jsonSerializer;

这样配置后,你的请求体里的 URL 就会保持原样:{"key" : "http://myURL.com/},不会再出现多余的反斜杠了。

兼容 iOS 9 及以下的备选方案

如果你的项目需要支持 iOS 9 或更早版本,因为当时还没有 NSJSONWritingWithoutEscapingSlashes 这个系统选项,我们可以自定义一个请求序列化器,重写序列化逻辑做“事后补救”:

@interface CustomJSONRequestSerializer : AFJSONRequestSerializer
@end

@implementation CustomJSONRequestSerializer

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request withParameters:(id)parameters error:(NSError *__autoreleasing *)error {
    NSURLRequest *serializedRequest = [super requestBySerializingRequest:request withParameters:parameters error:error];
    if (serializedRequest.HTTPBody) {
        // 将自动转义的\/替换回原始的/
        NSString *bodyString = [[NSString alloc] initWithData:serializedRequest.HTTPBody encoding:NSUTF8StringEncoding];
        bodyString = [bodyString stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"];
        NSMutableURLRequest *mutableRequest = [serializedRequest mutableCopy];
        mutableRequest.HTTPBody = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
        serializedRequest = mutableRequest;
    }
    return serializedRequest;
}

@end

然后使用这个自定义序列化器:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [CustomJSONRequestSerializer serializer];

不过要注意,这种替换方式是“事后修复”,如果你的参数里本身就有合法的 \/ 内容,可能会被误替换,所以只适合确定参数里没有这类特殊场景的情况。

另外补充一句:其实按照 JSON 标准,\/ 是合法的表示,大部分后端框架都能正确解析并还原成 /,如果后端可以调整的话,也可以考虑让后端兼容这种格式哦~

内容的提问来源于stack exchange,提问作者Thomas R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:48:58