2012-10-11 30 views
8

Hiện tại tôi đang viết một ứng dụng (Nhắm mục tiêu iOS 6, ARC bật) sử dụng JSON để truyền dữ liệu và Dữ liệu cốt lõi để lưu trữ liên tục. Dữ liệu JSON được tạo ra từ một cơ sở dữ liệu MySQL bởi một tập lệnh PHP thông qua json_encode.Kết quả NSJSONSerialization trong EXC_BAD_ACCESS

Vấn đề của tôi là với các dữ liệu từ các bảng số đoạn mã sau thất bại:

- (NSDictionary *)executeFetch:(NSString *)query 
{ 
    NSURL *requesturl = [NSURL URLWithString:[query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

    NSError *dataError = nil; 
    self.jsonData = [NSData dataWithContentsOfURL:requesturl options:kNilOptions error:&dataError]; 

    NSError *error = nil; 
    self.jsonSerializationResult = [NSJSONSerialization JSONObjectWithData:self.jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error]; 

    return self.jsonSerializationResult; 

} 

Chương trình luôn bị treo với một lỗi EXC_BAD_ACCESS trên đường, nơi nó nói self.jsonSerializationResult và cụ nói rằng có là một Zombie được phát hiện. Tôi biết rằng điều này có nghĩa là một số đối tượng tôi gửi một tin nhắn là không, nhưng tôi không thể tìm ra cách sửa chữa nó ... Đó là những gì Instruments có thể nói:

# Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller 
0 0xa1b8a70 CFString (mutable) Malloc 1 00:01.603.081 32 Foundation -[NSPlaceholderMutableString initWithBytesNoCopy:length:encoding:freeWhenDone:] 
1 0xa1b8a70 CFString (mutable) Release 0 00:01.603.137 0 Foundation newJSONValue 
2 0xa1b8a70 CFString (mutable) Zombie -1 00:01.603.259 0 Foundation newJSONString 

Chương trình của tôi hoạt động với mọi JSON đầu ra trừ trường hợp này:

{ 
    "termin":[ 
     { 
     "termin_id":"17", 
     "veranstaltung_id":"20", 
     "beginn":"2012-09-28 17:00:00", 
     "ende":"2012-09-28 18:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"18", 
     "veranstaltung_id":"26", 
     "beginn":"2012-09-28 19:00:00", 
     "ende":"2012-09-28 20:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"19", 
     "veranstaltung_id":"26", 
     "beginn":"2012-09-28 21:00:00", 
     "ende":"2012-09-28 22:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"20", 
     "veranstaltung_id":"46", 
     "beginn":"2012-09-28 19:00:00", 
     "ende":"2012-09-28 20:00:00", 
     "freie_pl\u00e4tze":null 
     }, 
     { 
     "termin_id":"24", 
     "veranstaltung_id":"66", 
     "beginn":"2012-09-28 22:00:00", 
     "ende":"2012-09-28 22:30:00", 
     "freie_pl\u00e4tze":"120" 
     } 
    ] 
} 

tôi nghĩ về một số lỗi có thể có nguồn gốc nhưng không ai có vẻ là người chịu trách nhiệm:

  • jsonData hoặc jsonSerializationResult có thể là con số không: họ không
  • PHP tạo ra JSON không hợp lệ: kiểm tra cho rằng với một validator
  • giá trị null: không phải là một vấn đề với các bảng khác

Có ai có một ý tưởng?

Trả lời

11

Dường như lỗi/thiếu sót với NSJSONSerialization. Vấn đề là do ký tự unicode thoát (freie_pl\u00e4tze thay vì freie_plätze). Bạn có hai tùy chọn -

  1. Chuyển đổi Unicode đã thoát thành ký tự Unicode thực. Hãy thử this SO answer
  2. Sử dụng một công cụ JSON khác, chẳng hạn như JSONKit. JSONKit cũng tuyên bố có hiệu suất cao hơn NSJSONSerialization.
+0

Cảm ơn bạn rất nhiều! Đó là điều duy nhất tôi không thay đổi trong khi kiểm tra sự khác biệt giữa dữ liệu bị lỗi và dữ liệu đang hoạt động ...Đáng ngạc nhiên là các ký tự thoát chỉ có vẻ là một vấn đề cho các phím từ điển, không phải cho các giá trị ... –

+0

BTW, tôi chỉ thấy điều này nếu tôi sử dụng 'NSJSONReadingMutableContainers | Các tùy chọn NSJSONReadingMutableLeaves'. Đây có phải là trải nghiệm của bạn không? – Rob

+0

Xin chào từ nhận xét mã 'AFNetworking'. :) Cảm ơn bạn, nó thực sự giúp! – skywinder

4

Tôi biết câu hỏi này đã được trả lời nhưng tôi nghĩ một số người mới bắt đầu có thể gặp vấn đề tương tự như tôi và được đưa đến câu hỏi này.

Thông báo EXC_BAD_ACCESS là do JSON không đúng định dạng. Như tôi đã vô tình sử dụng cùng tên cho một đối tượng gây ra các vấn đề khi chuyển đổi JSON thành một từ điển.

Đáng ngại nó không gây ra lỗi định dạng. Dưới đây là ví dụ về JSON gây ra sự cố:

"levels" : { 
    "level1": { 
     .... 
    }, 
    "level1": { 
     ... << All objects should have different names. This should be called level2. 
    }, 
    "level3": { 
     ... 
    } 

Để khắc phục vấn đề tôi phải đảm bảo rằng tất cả các đối tượng cùng cấp đều có tên khác nhau.

1

Chỉ cần kiểm tra NSJSONSerialization hôm nay. Với iOS 7.1. Nó đang làm việc. Không tìm thấy vấn đề nào. Có vẻ như Apple đã khắc phục vấn đề.

NSString* jsonString = @"{ \"freie_pl\\u00e4tze\":null}"; 

NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 

NSError *error = nil; 
NSDictionary* jsonSerializationResult = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error]; 

NSLog(@"%@", jsonSerializationResult);