AFNetworking序列化正斜杠,使JSON有效负载无效

时间:2015-10-09 03:03:55

标签: ios objective-c json afnetworking-2

我正在使用AFNetworking 2.0。

AFNetworking中,AFHTTPRequestOperationManager对象有一个API:

(AFHTTPRequestOperation *)POST:(NSString *)URLString
                    parameters:(id)parameters
                       success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

它接受NSDictionary作为我们希望“POST”到服务器的JSON Payload的参数。在我的有效载荷中,我有以下键值对:

"buttonActionParam":"/catalog/special/international-calling"

发布此有效内容服务器会返回无效的JSON。查看服务器端的有效负载,我意识到AFNetworking实际上正在发送:

"buttonActionParam":"\/catalog\/special\/international-calling".

我知道AFNetworking库使用NSJSONSerialization的类方法-dataWithJSONObject:,这会导致这种情况。我的问题是:

Q值。如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这是已知问题。它的实际行为与设计一致(见https://stackoverflow.com/a/20448342/669586)。

有3种可能的解决方案:

  1. 让您的服务器意识到可以转义字符串的可能性。一般来说,这是最好的解决方案。

  2. 使用其他JSON编码器(例如SBJson)并将对象编码为NSData,而不是使用AFNetworking默认序列化程序。

  3. 使用NSJSONSerialization进行编码,然后将结果数据转换为NSString(使用NSUTF8StringEncoding),对其进行清理并将其转换回NSData。同样,在将对象提供给AFNetworking之前,您必须这样做。

  4. 实施2或3的最佳方法是在requestSerializer实例上设置自定义AFHTTPSessionManager。例如,请参阅this answer以获取实现3的示例(请注意它在Swift中)。