2012-06-24 10 views
30

Mam twardy czas parsowania poniżej JSON ciąg na iOS 5.iOS 5 JSON Parsing Wyniki Cocoa Error 3840

{"States": [{"Name": "Arizona","Cities": [{"Name": "Phoenix"}]},{"Name": "California","Cities": [{"Name": "Orange County"},{"Name": "Riverside"},{"Name": "San Diego"},{"Name": "San Francisco"}]},{"Name": "Nevada","Cities": [{"Name": "Las Vegas"}]}]} 

A oto mój kod:

- (void) parseJson { 
NSError *jsonError = nil; 
NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"]]; 

if (jsonData) { 
    NSDictionary *jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError]; 

    if (jsonError) { 
     NSLog(@"JSON Error: %@", [jsonError localizedDescription]); 

     return; 
    } 

    NSLog(@"%@", jsonObjects); 
} 
} 

Dostaję ten błąd:

JSON Error: The operation couldn’t be completed. (Cocoa error 3840.)

będę wdzięczny za pomoc w tej sprawie bo cl wcześnie i niezdolni do naprawienia tego.

+0

Czy z powodzeniem ustawić jsonData? –

Odpowiedz

22

Jedną rzeczą, która wydaje mi się błędna jest taka:

[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"] 

Twoje dane to plik RTF ?? Powinien to być plik txt (lub jakikolwiek inny rodzaj zwykłego pliku tekstowego). Pliki RTF zazwyczaj zawierają dane formatowania tekstu, takich jak to:

{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470 
{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 
{\colortbl;\red255\green255\blue255;} 
\margl1440\margr1440\vieww10800\viewh8400\viewkind0 
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural 

\f0\fs24 \cf0 \{"States": [\{"Name": "Arizona","Cities": [\{"Name": "Phoenix"\}]\},\{"Name": "California","Cities": [\{"Name": "Orange County"\},\{"Name": "Riverside"\},\{"Name": "San Diego"\},\{"Name": "San Francisco"\}]\},\{"Name": "Nevada","Cities": [\{"Name": "Las Vegas"\}]\}]\}} 

Kiedy czytam że w postaci danych i spróbować przeanalizować go jako JSON, otrzymuję błąd jesteś widzeniem 3840. opis tego błędu mówi:

The data couldn’t be read because it has been corrupted. (No string key for value in object around character 2.)

Więc jak to wygląda dla mnie jest to, że w rzeczywistości nie mają JSON. Masz dane RTF.

+1

Tak, masz rację, to było to. Człowieku, teraz czuję się naprawdę głupi ... Dzięki za pomoc. – Gup3rSuR4c

1

Jeśli przybył tu ze względu na JSON, a nie ze względu na RTF, proszę sprawdzić to odpowiedź: IOS JSON Deserialization failure - STIG/NSJSONSerializer

+1

Mam ten błąd z powodu nieprawidłowego JSON (końcowe, na końcu definicji obiektu JSON). Ogólna rada może polegać na weryfikacji twojego JSON-a za pomocą dowolnej z wielu stron WWW walidatora JSON. –

10

I trafił podobny problem. Mój parser JSON działa sporadycznie podczas pobierania danych JSON z serwera. Czy otrzymałeś dane JSON z tej funkcji?

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

NSData zwrócone od tej czynności może być częściowe dane. Należy dodać appendData do zmiennej instancji o typie: NSMutableData. Następnie należy przetworzyć JSON w innej funkcji w następujący sposób:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

Czytając ten artykuł do szczegółów. To działa na mnie

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

10

udało mi się rozwiązać moje JSON 3840 błąd poprzez przekształcenie obiektu NSData do NSString:

NSError *error; 

NSObject *object = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

if (object == nil) { 
    NSString *serverResponse = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]; 

    NSLog(@"\n\nError:\n%@\n\nServer Response:\n%@\n\nCrash:", error.description, serverResponse); 
    [NSException raise:@"Invalid Data" format:@"Unable to process web server response."]; 
} 
+0

to mi pomogło. masz pojęcie, co ta odpowiedź może oznaczać @kraftydevil? Serwer napotkał błąd wewnętrzny i nie był w stanie ukończyć żądania. Albo serwer jest przeciążony, albo wystąpił błąd w aplikacji – SleepsOnNewspapers

+1

@ hsavit1 Moja wiedza zatrzymuje się na natywnej przestrzeni. Twój błąd to zdecydowanie problem z serwerem/serwisem internetowym, ale jest ponad moją głową. – kraftydevil