web-dev-qa-db-fra.com

Résultats de l'analyse JSON iOS 5 dans l'erreur de cacao 3840

J'ai du mal à analyser la chaîne JSON ci-dessous sur iOS 5.

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

Et voici mon code:

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

Je reçois toujours cette erreur:

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

J'apprécierais de l'aide à ce sujet parce que je suis clairement et incapable de résoudre ce problème.

30
Gup3rSuR4c

Une chose qui me semble incorrecte est la suivante:

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

Vos données sont un fichier RTF ?? Il doit s'agir d'un fichier txt (ou de tout autre type de fichier texte brut). RTF contiennent généralement des données de formatage de texte, comme ceci:

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

Lorsque je lis que en tant que données et que j'essaie de l'analyser en JSON, j'obtiens l'erreur 3840 que vous voyez. La description de cette erreur dit:

Les données n'ont pas pu être lues car elles ont été corrompues. (Aucune clé de chaîne pour la valeur dans l'objet autour du caractère 2.)

Donc, cela me semble que vous n'avez pas réellement JSON. Vous disposez de données RTF.

22
Dave DeLong

J'avais rencontré un problème similaire. Mon analyseur JSON fonctionne par intermittence lorsque je télécharge les données JSON à partir d'un serveur. Avez-vous obtenu vos données JSON de cette fonction?

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

Les NSData renvoyés par cette fonction peuvent être des données partielles. Vous devez ajouter des données à une variable d'instance de type: NSMutableData. Ensuite, vous traitez votre JSON dans une autre fonction comme suit:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

Lire cet article pour les détails. Ça marche pour moi

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

11
nebitrams

J'ai pu résoudre mon erreur JSON 3840 en convertissant l'objet NSData en 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."];
}
10
kraftydevil

Si vous êtes arrivé ici à cause du JSON et non à cause du RTF, veuillez vérifier cette réponse: Échec de désérialisation JOS IOS - STIG/NSJSONSerializer

1
James Roeiter