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

Posted

技术标签:

【中文标题】AFNetworking 序列化正斜杠使 JSON 有效负载无效【英文标题】:AFNetworking serializes forward slash making the JSON payload invalid 【发布时间】:2015-10-09 03:03:55 【问题描述】:

我正在使用AFNetworking 2.0。

AFNetworkingAFHTTPRequestOperationManager 对象有一个API:

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

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

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

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

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

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

问。如何解决这个问题?

【问题讨论】:

不确定我是否理解这个问题:您是说您正在尝试发送“buttonActionParam”:“/catalog/special/international-calling”,而这正是发送的内容AFNetworking,有什么问题? 编辑了我的问题。不得不放转义字符。 :) 来自NSJSONSerializationNSData 与您在服务器端看到的不太一样——它在我的十六进制编辑器中显示"buttonActionParam":"\/catalog\/special\/international-calling"。我想知道这是否是字符编码问题 - 看起来服务器出于某种原因坚持了额外的转义 \。 @RichTolley 我编辑了来自 NSJSONSerialization 的内容。我正在寻找 "buttonActionParam":"/catalog/special/international-calling" 而不是 "buttonActionParam":"\/catalog\/special\/international-calling" 【参考方案1】:

这是已知问题。它实际上按设计运行(请参阅https://***.com/a/20448342/669586)。

有3种可能的解决方案:

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

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

    使用NSJSONSerialization 进行编码,然后将生成的数据转换为NSString(使用NSUTF8StringEncoding),对其进行清理并将其转换回NSData。同样,您必须在将对象提供给 AFNetworking 之前执行此操作。

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

【讨论】:

#2 仅在 AFNetworking 之后使用 SBJson 时才有效。 #3 我在发布之前尝试过。不工作。我会尝试#1。 @DeborshiSaha 不,主要是关于如何设置序列化程序。如果你不让 AFNetworking 使用它的默认请求序列化器(它使用NSJSONSerialization),那么你没有问题。

以上是关于AFNetworking 序列化正斜杠使 JSON 有效负载无效的主要内容,如果未能解决你的问题,请参考以下文章

用正斜杠转义 json 字符串?

AFNetworking JSON 序列化问题

为啥从 django rest 框架返回的 JSON 在响应中有正斜杠?

来自熊猫数据框的 json 文件中的正斜杠

为啥JSON字符串当中会出现反斜杠?

json特殊字符都有哪些