2012-06-24 17 views
30

Sto attraversando un momento difficile parsing della stringa qui sotto JSON su iOS 5.iOS 5 JSON Risultati Parsing a Cocoa Errore 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"}]}]} 

Ed ecco il mio codice:

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

continuo a ricevere questo errore:

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

mi farebbe piacere un po 'di aiuto su questo perché ho cl precoce e incapace di risolverlo.

+0

tanto meno vi figurano con successo jsonData? –

risposta

22

Una cosa che mi colpisce come corretta è questa:

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

tuoi dati sono un file RTF ?? Dovrebbe essere un file txt (o qualsiasi altro tipo di file di testo normale). I file RTF di solito contengono i dati di formattazione del testo, in questo modo:

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

Quando ho letto che come un dato e cercare di analizzare come JSON, ottengo l'errore 3840 si sta vedendo. La descrizione dell'errore dice:

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

Quindi quello che mi sembra è che in realtà non si dispone di JSON. Hai dati RTF.

+1

Sì, hai ragione, era così. Amico, mi sento davvero stupido in questo momento ... Grazie per l'aiuto però. – Gup3rSuR4c

1

Se siete arrivati ​​qui a causa della JSON e non a causa del formato RTF, si prega di consultare questa risposta: IOS JSON Deserialization failure - STIG/NSJSONSerializer

+1

Ho ricevuto questo errore dall'avere solo JSON non valido (alla fine della definizione dell'oggetto JSON). Il consiglio generico potrebbe essere quello di verificare il tuo JSON utilizzando una delle tante pagine web del validatore JSON. –

10

mi aveva colpito un problema simile. Il mio parser JSON funziona a intermittenza quando scarico i dati JSON da un server. Hai ottenuto i tuoi dati JSON da questa funzione?

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

Gli NSData restituiti da questa funzione potrebbero essere dati parziali. È necessario aggiungere Dati a una variabile di istanza con tipo: NSMutableData. Quindi si elabora il JSON in un'altra funzione come segue:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

Leggere questo articolo per i dettagli. Funziona per me

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

10

ero in grado di risolvere il mio errore JSON 3840 convertendo l'oggetto NSData a un 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

questo mi ha aiutato. hai idea di cosa possa significare questa risposta @kraftydevil? Il server ha riscontrato un errore interno e non è stato in grado di completare la richiesta. O il server è sovraccarico o c'è un errore nell'applicazione – SleepsOnNewspapers

+1

@ hsavit1 La mia conoscenza si ferma proprio nello spazio nativo. Il tuo errore è sicuramente un problema con il server/servizio web, ma è sopra la mia testa. – kraftydevil