NSJSONSerialization + AFNetworking无法识别的选择器错误

时间:2012-03-19 22:23:19

标签: ios json ios5 afnetworking

更新:我刚刚使用JSONlint测试了从服务器返回的JSON格式,这很好。

我在AFNetworking调用返回JSON数据的php脚本时遇到NSJSONSerialization异常。我在这里查看了同样问题的其他问题并尝试了这些解决方案,但仍然收到错误。

在此行崩溃:

 NSError *e = nil;
 NSMutableArray *jsonArray = 
 [NSJSONSerialization JSONObjectWithData: jsonData 
                                 options: NSJSONReadingMutableContainers 
                                   error: &e];

错误日志:

  

2012-03-19 18:10:41.291 imageUploader [3538:207] * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFArray bytes]:无法识别的选择器发送到实例0x6867430'

当我通过浏览器调用php脚本时,我的JSON数据如下所示:

  

[{ “用户”: “宾基”, “路径”: “宾基-0a96f9aab5267c8.jpg”, “索引”: “101”},{ “用户”: “宾基”, “路径”:“binky- 9cf844252c28553.jpg”, “索引”: “102”},{ “用户”: “宾基”, “路径”: “宾基-d6c749d25d33015.jpg”, “索引”: “103”}]

数据的NSLog如下所示:

  

(           {           index = 101;           path =“binky-0a96f9aab5267c8.jpg”;           user = binky;       },           {           index = 102;           path =“binky-9cf844252c28553.jpg”;           user = binky;       },           {           index = 103;           path =“binky-d6c749d25d33015.jpg”;           user = binky;       })

最后,我做了一个测试,以确保我有有效的JSON数据:

         if ([NSJSONSerialization isValidJSONObject: jsonData]){
             NSLog(@"Good JSON \n");
         }

所以我无法理解错误来源的位置。帮助不大?

// AFNetworking操作+块

    AFJSONRequestOperation *operation = 
    [AFJSONRequestOperation JSONRequestOperationWithRequest:myRequest 
     success:^(NSURLRequest *request, NSHTTPURLResponse *response, id jsonData) {

         NSLog(@"Success JSON data:\n %@ \n", jsonData); //log data

         if ([NSJSONSerialization isValidJSONObject: jsonData]){
             NSLog(@"Good JSON \n");
         }

         NSError *e = nil;
         NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData: jsonData options: NSJSONReadingMutableContainers error: &e];

         if (!jsonArray) {
             NSLog(@"Error parsing JSON: %@", e);
         } else {
             for(NSDictionary *item in jsonArray) {
                 NSLog(@"Item: %@", item);
             }
         }

         [self.navigationController popToRootViewControllerAnimated:YES];
     } 
     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

         NSLog(@"Error: %@", error);
         [self.navigationController popToRootViewControllerAnimated:YES];
     }];

1 个答案:

答案 0 :(得分:7)

显然JSONObjectWithData需要NSData而不是数组。 id jsonData似乎是一个表示json字符串内容的Array。很明显,无论如何你都期待一个阵列。

出于某种原因,你要做两次。而不是

 NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData: jsonData options: NSJSONReadingMutableContainers error: &e];

你可以简单地使用

NSMutableArray *jsonArray = [NSMutableArray arrayWithArray:jsonData];

或者,如果它不必是可变的:

NSArray *jsonArray = (NSArray *) jsonData;

但是,您应该始终测试它是否真的是jsonData中的数组。根据json字符串中的结构,如果出现错误,它可能是NSDictionary或nil。