2012-03-19 23 views
5

Cập nhật: Tôi vừa kiểm tra định dạng JSON của mình được trả về từ máy chủ sử dụng JSONlint và điều đó là tốt.lỗi chọn không được nhận dạng với NSJSONSerialization + AFNetworking

Tôi nhận được ngoại lệ với NSJSONSerialization trong lệnh gọi AFNetworking tới tập lệnh php trả về dữ liệu JSON. Tôi đã xem xét các câu hỏi khác ở đây với cùng một vấn đề và đã thử các giải pháp đó nhưng vẫn gặp lỗi.

Nó bị treo trên dòng này:

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

Lỗi Log:

2012-03-19 18: 10: 41,291 imageUploader [3538: 207] * Ngừng ứng dụng do ngoại lệ không xác định 'NSInvalidArgumentException', lý do: '- [__ NSCFArray bytes]: bộ chọn không được nhận dạng được gửi tới ví dụ 0x6867430'

dữ liệu JSON của tôi, khi tôi gọi là kịch bản php thông qua trình duyệt trông như thế này:

[{ "người sử dụng": "Binky", "con đường": "Binky-0a96f9aab5267c8.jpg"," chỉ mục ":" 101 "}, {" người dùng ":" binky "," đường dẫn ":" binky-9cf844252c28553.jpg "," chỉ mục ":" 102 "}, {" người dùng ":" binky "," đường dẫn " : "Binky-d6c749d25d33015.jpg", "chỉ số": "103"}]

các NSLog của dữ liệu trông như thế này:

( { chỉ mục = 101; path = "binky-0a96f9aab5267c8.jpg"; người dùng = binky; }, { chỉ mục = 102; path = "binky-9cf844252c28553.jpg"; người dùng = binky; }, { chỉ số = 103; path = "binky-d6c749d25d33015.jpg"; người dùng = binky; })

Cuối cùng, tôi làm một bài kiểm tra để chắc chắn rằng tôi có dữ liệu JSON hợp lệ:

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

Vì vậy, tôi không thể hiểu được đâu là nguồn gốc của lỗi của tôi là. Sự giúp đỡ nhỏ?

// AFNetworking hoạt động + khối

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

Trả lời

7

aparently JSONObjectWithData hy vọng NSData chứ không phải là một mảng. id jsonData có vẻ là một mảng biểu thị nội dung của chuỗi json của bạn. Aparently bạn đang mong đợi một Array anyway.

Vì một số lý do bạn thực hiện việc này hai lần.Thay vì

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

bạn có thể chỉ cần sử dụng

NSMutableArray *jsonArray = [NSMutableArray arrayWithArray:jsonData]; 

hoặc, nếu nó không phải là có thể thay đổi:

NSArray *jsonArray = (NSArray *) jsonData; 

Tuy nhiên, bạn nên luôn luôn kiểm tra xem nó thực sự là một mảng trong jsonData. Tùy thuộc vào cấu trúc bên trong chuỗi json nó có thể là một NSDictionary hoặc nil trong trường hợp lỗi.

+0

cảm ơn. Chuyển đổi jsondata đến thành 'NSMutableArray' hoạt động nhưng sau đó tôi không hiểu tại sao tôi cần' NSJSONSerialization' ở đây (nó được sử dụng trong rất nhiều mã ví dụ giống như của tôi). –

Các vấn đề liên quan