2012-10-11 20 views
8

Obecnie piszę aplikację (docelowy iOS 6, ARC włączone), który używa JSON do transmisji danych i Core Data dla trwałego przechowywania. Dane JSON są generowane z bazy danych MySQL przez skrypt PHP za pomocą json_encode.NSJSONSerialization skutkuje EXC_BAD_ACCESS

Moim problemem jest to, że dane z niektórych stołach następujący kod nie powiedzie się:

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

} 

Program zawsze wywala z błędem EXC_BAD_ACCESS na linii, gdzie mówi self.jsonSerializationResult i Instrumenty mówi, że nie było Zombie wykryte. Wiem, że oznacza to, że jakiś przedmiot wysłać wiadomość jest zerowa, ale nie mogę dowiedzieć się, jak to naprawić ... To, co ma do powiedzenia Instruments:

# 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 

Mój program działa z każdym JSON wyjście poza tym jednym:

{ 
    "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" 
     } 
    ] 
} 

Myślałem o jakimś możliwym błędem pochodzących ale nikt zdaje się być odpowiedzialny:

  • jsonData lub jsonSerializationResult może być zerowa: nie są one
  • PHP generowane nieważne JSON: sprawdzić, które z walidatora
  • zerowe wartości: nie jest to problem z innych tabel

Czy ktoś ma pomysł?

Odpowiedz

11

Wygląda jak błąd/niedociągnięcie z NSJSONSerialization. Problem jest spowodowany przez znaki z unikalnymi znakami Unicode (freie_pl\u00e4tze zamiast freie_plätze). Dostępne są dwie opcje -

  1. Konwertuj kodowany kod Unicode na prawdziwe znaki Unicode. Wypróbuj this SO answer
  2. Użyj innego silnika JSON, na przykład JSONKit. JSONKit twierdzi również, że jest bardziej wydajny niż NSJSONSerialization.
+0

Dziękuję bardzo! To była jedyna rzecz, której nie zmieniłem, badając różnice pomiędzy uszkodzonymi danymi a działaniem ...Zaskakujące jest to, że znaki ze znakami "escape" wydają się być problemem dla kluczy słownika, a nie dla wartości ... –

+0

BTW, widzę to tylko, jeśli używam 'NSJSONReadingMutableContainers | Opcje NSJSONReadingMutableLeaves'. Czy to też jest twoje doświadczenie? – Rob

+0

Witam z komentarzy kodu "AFNetworking". :) Dziękuję, to naprawdę pomaga! – skywinder

4

Wiem, że to pytanie zostało odebrane, ale myślę, że niektórzy początkujący mogą mieć taki sam problem jak ja i zostać doprowadzeni do tego pytania.

Wiadomość EXC_BAD_ACCESS została spowodowana przez nieprawidłowy JSON. Ponieważ przypadkowo użyłem tej samej nazwy dla obiektu, który powoduje problemy podczas konwersji JSON do słownika.

Irytujące, że nie spowodowało błędu formatowania. Oto przykład z JSON, który spowodował problem:

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

Aby rozwiązać ten problem miałem w celu zapewnienia, że ​​wszystkie obiekty o tym samym poziomie miały różne nazwy.

1

Właśnie przetestowałem NSJSONSerialization dzisiaj. Z iOS 7.1. To działa. Nie znaleziono problemu. Wygląda na to, że Apple naprawił problem.

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); 
Powiązane problemy