2012-06-24 6 views
30

Estoy teniendo dificultades para analizar la cadena JSON a continuación en iOS 5.iOS 5 JSON al analizar los resultados en 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"}]}]} 

Y aquí está mi código:

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

sigo recibiendo este error:

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

lo agradecería un poco de ayuda en esto porque me CL temprano e incapaz de arreglar esto.

+0

tampoco establece con éxito jsonData? –

Respuesta

22

Una cosa que me parece incorrecto es la siguiente:

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

Sus datos es un archivo RTF ?? Debe ser un archivo txt (o cualquier otro tipo de archivo de texto sin formato). Los archivos RTF normalmente contienen datos de formato de texto, así:

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

Cuando leí que en como los datos y tratar de analizarlo como JSON, me sale el error 3840 que se está viendo. La descripción de ese error dice:

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

Así que lo que a mí me parece es que en realidad no tienes JSON. Tienes datos RTF.

+1

Sí, tienes razón, eso fue todo. Hombre, me siento realmente estúpido ahora mismo ... Gracias por la ayuda. – Gup3rSuR4c

1

Si llegaste aquí a causa de la JSON y no a causa de la RTF, por favor echa un vistazo a esta respuesta: IOS JSON Deserialization failure - STIG/NSJSONSerializer

+1

Obtuve este error solo por tener JSON no válido (al final, al final de la definición del objeto JSON). El consejo genérico puede ser verificar su JSON utilizando cualquiera de las muchas páginas web de validador JSON que existen. –

10

que había tocado un problema similar. Mi analizador JSON funciona intermitentemente cuando descargo los datos JSON de un servidor. ¿Obtuviste tus datos JSON de esta función?

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

Los NSData devueltos desde esta función podrían ser datos parciales. Necesita anexarData a una variable de instancia con tipo: NSMutableData. A continuación, procesa su JSON en otra función de la siguiente manera:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

Leyendo este artículo para más detalles. Funciona para mí

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

10

yo era capaz de solucionar los problemas de error de JSON 3840 convirtiendo el objeto 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

esto me ayudó. ¿Tienes alguna idea de lo que esta respuesta podría significar @kraftydevil? El servidor encontró un error interno y no pudo completar su solicitud. O el servidor está sobrecargado o hay un error en la aplicación – SleepsOnNewspapers

+1

@ hsavit1 Mi conocimiento se detiene en el espacio nativo. Su error es definitivamente un problema con el servidor/servicio web, pero está por encima de mi cabeza. – kraftydevil