AFNetworking 序列化正斜杠使 JSON 有效负载无效
Posted
技术标签:
【中文标题】AFNetworking 序列化正斜杠使 JSON 有效负载无效【英文标题】:AFNetworking serializes forward slash making the JSON payload invalid 【发布时间】:2015-10-09 03:03:55 【问题描述】:我正在使用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 作为我们希望“发布”到服务器的 JSON 有效负载的参数。在我的有效负载中,我有以下键值对:
"buttonActionParam":"/catalog/special/international-calling"
发布此有效负载服务器会返回无效的 JSON。查看服务器端的有效载荷,我意识到 AFNetworking 实际上是在发送:
"buttonActionParam":"\/catalog\/special\/international-calling".
我知道AFNetworking
库使用NSJSONSerialization
的类方法-dataWithJSONObject:
,导致了这种情况。我的问题是:
问。如何解决这个问题?
【问题讨论】:
不确定我是否理解这个问题:您是说您正在尝试发送“buttonActionParam”:“/catalog/special/international-calling”,而这正是发送的内容AFNetworking,有什么问题? 编辑了我的问题。不得不放转义字符。 :) 来自NSJSONSerialization
的NSData
与您在服务器端看到的不太一样——它在我的十六进制编辑器中显示"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 有效负载无效的主要内容,如果未能解决你的问题,请参考以下文章