Malloc
Malloc

Reputation: 16276

Parsing JSON response

I am using AFJSONRequestOperation to request a remote 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"];

However, the app crashes and I am getting this error:

[__NSCFDictionary dataUsingEncoding:]: unrecognized selector sent to instance

Here is an NSLog for the JSON object returned:

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

Am I missing something, because I think that I am not parsing correctly the JSON object. Please correct me.

Upvotes: 2

Views: 1259

Answers (2)

paulmelnikow
paulmelnikow

Reputation: 17208

It looks like AFJSONRequestOperation is deserializing JSON to a dictionary for you, and then you're trying to do it again. JSON is an NSDictionary but you're calling an NSString method.

Remove all of this code:

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];

And replace it with:

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

(That'll work safely without checking array bounds, but assumes that there's only one element in the array.)

Upvotes: 1

Felix
Felix

Reputation: 35384

The object you get in the success block is already parsed by AFJSONRequestOperation. In your case you get a NSDictionary object.

You can check the class of the object using the isKindofClass-method:

if ([JSON isKindOfClass:[NSDictionary class]]) {
   NSDictionary* dict = (NSDictionary*)JSON;
   ...
}

Upvotes: 1

Related Questions