2

AFJSONRequestOperation用来请求远程 API:

 NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

        //Remove the SVProgressHUD view
        [SVProgressHUD dismiss];

        //Check for the value returned from the server

        NSData *jsonData = [JSON dataUsingEncoding:NSUTF8StringEncoding];//This line cause crash
        NSArray *arr = [NSJSONSerialization JSONObjectWithData:jsonData
                                                       options:0
                                                         error:nil];
        loginDic=[[NSDictionary alloc]init];
        loginDic=[arr objectAtIndex:0];
        NSLog(@"%@",loginDic);

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

        NSLog(@"Request Failed with Error: %@", [error.userInfo objectForKey:@"NSLocalizedDescription"]);
    }];
    [operation start];
    [SVProgressHUD showWithStatus:@"Loading"];

但是,应用程序崩溃了,我收到了这个错误:

[__NSCFDictionary dataUsingEncoding:]: unrecognized selector sent to instance

这是NSLog返回的 JSON 对象的一个​​:

 Result =     (
                {
            operation = 5;
            result = 1;
        }
    );

我是否遗漏了什么,因为我认为我没有正确解析 JSON 对象。请纠正我。

4

2 回答 2

1

您在成功块中获得的对象已经被AFJSONRequestOperation. 在您的情况下,您会得到一个 NSDictionary 对象。

您可以使用 - 方法检查对象的类isKindofClass

if ([JSON isKindOfClass:[NSDictionary class]]) {
   NSDictionary* dict = (NSDictionary*)JSON;
   ...
}
于 2013-02-18T16:02:32.130 回答
1

看起来 AFJSONRequestOperation 正在为您将 JSON 反序列化为字典,然后您再次尝试这样做。JSON是一个 NSDictionary 但你正在调用一个 NSString 方法。

删除所有这些代码:

NSData *jsonData = [JSON dataUsingEncoding:NSUTF8StringEncoding];//This line cause crash
NSArray *arr = [NSJSONSerialization JSONObjectWithData:jsonData
                                                   options:0
                                                     error:nil];
loginDic=[[NSDictionary alloc]init];
loginDic=[arr objectAtIndex:0];

并将其替换为:

loginDic = [[JSON objectForKey:@"Result"] lastObject];

(这将在不检查数组边界的情况下安全地工作,但假设数组中只有一个元素。)

于 2013-02-18T16:03:56.387 回答