作为 NSDictionary 而不是 NSData 接收响应
Posted
技术标签:
【中文标题】作为 NSDictionary 而不是 NSData 接收响应【英文标题】:Receive response as NSDictionary instead of NSData 【发布时间】:2016-01-17 15:15:25 【问题描述】:我试图从服务器获取响应为NSDictionary
而不是NSData
,所以首先我使用AFNetworking 库并且服务器请求这些设置是HTTP 而不是JSON
序列化程序,如下所示:
self.responseSerializer = AFHTTPResponseSerializer() as AFHTTPResponseSerializer
self.requestSerializer = AFHTTPRequestSerializer() as AFHTTPRequestSerializer
self.requestSerializer.HTTPMethodsEncodingParametersInURI = NSSet(array: ["GET"]) as! Set<String>
self.responseSerializer.acceptableContentTypes = NSSet(objects: "application/json","text/json","text/javascript","text/html") as? Set<String>
接下来是当我从服务器获得响应时,它是NSData
,因为我使用的是AFHTTPRequestSerializer()
,这是我的代码:
self.POST(addUserURL, parameters: dictionary, progress: nil, success: (task, responseObject) -> Void in
print(responseObject)
) (task, error) -> Void in
同样在 AFNetworking 块内部,它不允许处理 NSJSONSerializtion
的 try 和 catch,这可能是一个可能的解决方案,但它不起作用。
【问题讨论】:
AFNetworking returning NSCFData; issue with registerHTTPOperationClass的可能重复 【参考方案1】:使用NSJSONSerialization
如下代码所示:
do
let jsonObject = try NSJSONSerialization.JSONObjectWithData(responseObject, options: .AllowFragments) as! NSDictionary
// use jsonObject here
catch
print("json error: \(error)")
【讨论】:
我得到:json error: Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo=NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.
因为它的 AFHTTPResponseSerializer 所以我无法设置读取选项来允许片段,我在整个互联网上都找不到解决方案!
嗯,它返回以下内容:` json error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo=NSDebugDescription=字符 0. 周围的值无效表示它不是 JSON 格式。那我该怎么办?
有很多相同的问题:google.co.in/…【参考方案2】:
由于您从服务器获得的响应没有 Array
或 Dictionary
的***对象,您必须指定 AFNetworking 应该使用的自定义读取选项。
为此,您必须在 AFURLSessionManager
类的实例上设置 responseSerializer
属性。你可以这样做:
let sessionManager = OLFURLSessionManager.init() //you probably want to keep session manager as a singleton
sessionManager.responseSerializer = AFJSONResponseSerializer.serializerWithReadingOptions(.AllowFragments)
//you should use that instance of session manager to create you data tasks
之后,您应该能够正确解析来自服务器的响应,如下所示:
【讨论】:
以上是关于作为 NSDictionary 而不是 NSData 接收响应的主要内容,如果未能解决你的问题,请参考以下文章
将包含 NSArray 的 NSDictionary 转换为 JSON
NSDictionary 的 NSArray - 当数组中只有一个字典而不是一个对象的数组时返回 NSDictionary