1

我继承了AFHTTPClient&我将该AFJSONRequestOperation类注册为请求处理程序,如下所示

- (id)initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];
    if (!self) {
        return nil;
    }

    [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
    [self setDefaultHeader:@"Accept" value:@"application/json"];
    self.parameterEncoding = AFJSONParameterEncoding;

    return self;
}

但是,我需要将解析后的 json 转换为 Mutable 对象。我发现有一个 JSONReadingOptions 属性,AFJSONRequestOperation但我无法弄清楚如何设置它,因为我直接使用AFHTTPClient.

4

2 回答 2

2

这很简单。

  1. 创建 AFJSONRequestOperation 的子类。
  2. 在 AFHTTPClient 的子类中更改它:
 [__instance registerHTTPOperationClass:[AFJSONRequestOperation class]];

对此:

[__instance registerHTTPOperationClass:[CustomClassJSONRequestOperation class]];

在 CustomClassJSONRequestOperation.m 中只需这样写:

- (id)responseJSON {
    [self setJSONReadingOptions: NSJSONReadingMutableContainers | NSJSONReadingAllowFragments];    
    return [super responseJSON];
}
于 2013-10-25T08:56:44.463 回答
1

我的一个请求失败并返回错误:

JSON 文本未以数组或对象开头,并且允许未设置片段的选项。

要设置 JSONReadingOptions 我必须子类化AFJSONRequestOperation,然后在从静态工厂方法返回的实例上设置属性。

+ (instancetype)JSONRequestOperationWithRequest:(NSURLRequest *)urlRequest
                                        success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, id JSON))success
                                        failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON))failure
{
    AFJSONRequestOperation *requestOperation = [super JSONRequestOperationWithRequest:urlRequest success:success failure:failure];
    requestOperation.JSONReadingOptions = NSJSONReadingAllowFragments;
    return (MyRequestSubclass *)requestOperation;
}

然后,在您的客户端中,在初始化 sharedClient 时将您的子类设置为 HTTPOperationClass

[__instance registerHTTPOperationClass:[AFJSONRequestOperation class]];

......然后,原来我打的api恰好是down了,所以它返回了一个html错误页面......

长话短说,在您打扰之前,请确保响应不仅格式不正确,而且它首先存在。

于 2013-03-16T16:17:12.157 回答