AFNetworking 2.0 和响应序列化选项

Posted

技术标签:

【中文标题】AFNetworking 2.0 和响应序列化选项【英文标题】:AFNetworking 2.0 and Response Serialization Options 【发布时间】:2013-10-28 19:36:20 【问题描述】:

一旦我触发对 JSON 资源的请求,我就会得到以下信息:

The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x1d87a2c0 NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.

问题是我应该在哪里设置AFNetworking 2.0 中的允许片段?

更新:

我的类是 AFHTTPSessionManager 的子类。我已经创建了一个 JSONResponseSerializer,它也不起作用。

返回的JSON如下:

   ["StoryId":1,"Title":"The big red dog","Abstract":"There was a big red dog and the dog was very big","IsFeatured":true]

-(instancetype) initWithBaseURL:(NSURL *)url

    NSURL *base = [NSURL URLWithString:@"URL to the web service that returns the json"];
    self = [super initWithBaseURL:base];

    AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];

    [self setResponseSerializer:responseSerializer];

    return self;

返回的错误如下:

[0] (null)  @"NSDebugDescription" : @"Invalid value around character 0."

来自网络服务器的响应:

["StoryId":1,"Title":"The big red dog","Abstract":"There was a big red dog and the dog was very big","IsFeatured":true]

来自网络服务器的响应状态:

HTTP/1.1 200 OK
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Content-Type: application/json;charset=utf-8
X-AspNetMvc-Version: 3.0
Connection: close
Date: Mon, 28 Oct 2013 20:02:21 GMT
Content-Length: 121
Cache-Control: private
X-AspNet-Version: 4.0.30319

["StoryId":1,"Title":"The big red dog","Abstract":"There was a big red dog and the dog was very big","IsFeatured":true]

【问题讨论】:

这是网络服务器响应的问题,不是 AFNetworking。 响应有效!我刚刚验证了 JSON,返回的是有效的 JSON。 我没有说它无效。我说问题是由它引起的。 JSON 数据往往包含在数组或对象中。 @Wain 是对的,你必须告诉 AFNetworking NSJSONSerialization 应该使用哪些选项来读取 JSON 数据。 我已经这样做了,看看我更新的问题! 啊,我看到你的编辑,我收回我的话。 【参考方案1】:

您需要使用serializerWithReadingOptions: 创建您自己的AFJSONResponseSerializer 实例并配置您的系统以使用它(代替默认的JSON 响应序列化程序)。

【讨论】:

请看我更新的问题!我添加了 AFJSONResponseSerializer 但仍然没有用! 您的 JSON 看起来没有片段。您确定正在使用您的自定义类吗? ...您确定响应没有损坏或包含在其他内容中吗? 请参阅标题“来自网络服务器的响应”的问题。这是我得到的实际响应。【参考方案2】:

我之前也遇到过同样的问题。经过几个小时的搜索和阅读,我发现了一些东西:

self.responseSerializer = [AFHTTPResponseSerializer 序列化器]; self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json; charset=UTF-8", nil];

试试吧,祝你好运!

【讨论】:

以上是关于AFNetworking 2.0 和响应序列化选项的主要内容,如果未能解决你的问题,请参考以下文章

具有大型 JSON 响应的 AFNetworking 2.0

AFNetworking 2.0:POST 返回成功响应但服务器未更新

如何从 AFnetworking 2.0 操作/NSURLSessioNDataTask 获取原始 JSON 响应?

obj-c AFNetworking 2.0 POST 请求不起作用

AFNetworking 2.0 - 如何从子类 AFHTTPSessionManager 成功将响应传递给另一个类

Afnetworking 2.0 参数编码