作为 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】:

由于您从服务器获得的响应没有 ArrayDictionary 的***对象,您必须指定 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 中

NSDictionary 的 NSArray - 当数组中只有一个字典而不是一个对象的数组时返回 NSDictionary

打印 NSDictionary 的键而不是值

JSONKit 返回不需要的 NSCFString 而不是 NSDictionary

带有 valueForKeyPath 的嵌套 NSDictionary 返回括号而不是 NSString