2008-11-13 52 views
18

J'ai fait quelques tests avec TouchJSON la nuit dernière et cela fonctionnait assez bien en général pour les cas simples. J'utilise le code suivant pour lire un contenu JSON à partir d'un fichier et désérialiser:Désérialisation d'un résultat JSON complexe (tableau de dictionnaires) avec TouchJSON

NSString *jsonString = [[NSString alloc] initWithContentsOfFile:@"data.json"]; 
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding]; 
NSError *error = nil; 
NSDictionary *items = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error]; 
NSLog(@"total items: %d", [items count]); 
NSLog(@"error: %@", [error localizedDescription]); 

Cela fonctionne très bien si j'ai un objet JSON très simple dans le fichier (par exemple un dictionnaire):

{"id": "54354", "name": "boohoo"} 

de cette façon, j'ai pu avoir accès au tableau de valeurs, comme je voulais l'élément en fonction de son index dans la liste:

NSArray *items_list = [items allValues]; 
NSString *name = [items_list objectAtIndex:1]; 

(je comprends que je pourrais avoir fet ched le nom avec l'API de dictionnaire)

Maintenant, je voudrais désérialiser une chaîne JSON semi-complexe, qui représente un tableau de dictionnaires. Un exemple d'une telle chaîne JSON est ci-dessous:

[{"id": "123456", "name": "touchjson"}, {"id": "3456", "name": "bleh"}] 

Lorsque je tente d'exécuter le même code ci-dessus contre ce nouveau contenu dans le fichier data.json, je ne reçois aucun résultat en arrière. Mon appel NSLog() indique "total items: 0" et aucune erreur ne revient dans l'objet NSError.

Des indices sur ce qui se passe? Je suis complètement perdu sur ce qu'il faut faire, car il n'y a pas beaucoup de documentation disponible pour TouchJSON, et beaucoup moins d'exemples d'utilisation.

Répondre

8

Ce n'est pas une réponse, mais un pointeur vers un autre cadre:

http://code.google.com/p/json-framework/

Je l'ai utilisé un peu ces derniers temps, sérialisation et de-sérialisation structures de données complexes de troisième services de fête tels que Google Local et entre mon propre code Objective-C et Perl avec absolument aucun problème. Sans oublier que l'API est ridiculement facile à gérer.

Bonne chance!

+0

Merci, j'ai été capable de comprendre comment désérialiser cette chaîne JSON complexe avec json-framework. – jpm

+0

J'ai aussi utilisé ce framework pour des structures json complexes et je n'ai pas encore rencontré de problèmes – seanalltogether

+2

Le lien est mort! – Gustav

0

à son cœur offres de JSON avec des objets, votre code à désérialiser devrait être comme suit

{"objects":[{"id": "123456", "name": "touchjson"}, {"id": "3456", "name": "bleh"}]}

qui fonctionne avec la dernière caisse.

+2

Un bon framework json devrait être capable de gérer un objet ou un tableau en tant que conteneur de haut niveau pour la structure de données – seanalltogether

+0

@sean - ce n'est pas vrai. Techniquement JSON avec un tableau en tant que conteneur de haut niveau n'est pas JSON légal. – schwa

+3

schwa, dit qui? http://www.ietf.org/rfc/rfc4627.txt?number=4627 "Un texte JSON est un objet sérialisé ou un tableau. JSON-text = objet/tableau" « 5. Générateurs Un générateur JSON produit du texte JSON.Le texte résultant DOIT être strictement conforme à la grammaire JSON. " Ce documentaire a même un tableau de niveau supérieur. Exemple – seanalltogether

12

Je suis l'auteur de TouchJSON.

Votre objet le plus externe doit être un dictionnaire et non un tableau. Tout ce qui n'est pas un dictionnaire n'est pas légal. Si vous devez avoir un tableau comme l'objet le plus externe puis utilisez la méthode (qui est techniquement obsolète, mais ne va nulle part bientôt)

- (id)deserialize:(NSData *)inData error:(NSError **)outError; 

Voir: http://www.json.com/json-schema-proposal/ pour plus d'informations abotu ce qui est et n'est pas légal JSON.

+0

J'apprécie votre réponse à ma question, tout d'abord. J'ai été surpris d'entendre que l'objet le plus externe ne peut pas être un tableau, car j'ai fait ce type de résultat JSON depuis longtemps maintenant, et la plupart du temps les choses fonctionnent bien avec d'autres bibliothèques. Poursuivant sur un commentaire séparé ... – jpm

+4

Selon la RFC JSON créée par Douglas Crockford lui-même (http://www.ietf.org/rfc/rfc4627.txt), les tableaux comme objets les plus externes sont parfaitement valides. Voir page 7/8 pour un exemple réel là-dedans. – jpm

+1

Voir http://robubu.com/?p=24 pour plus d'informations. Les tableaux de niveau supérieur doivent être évités. Peu importe que TouchJSON puisse les traiter - voir l'API i listée ci-dessus. – schwa

0

@Mathieu - Je pense que c'est ce que vous cherchez (6 mois de retard, je sais :), mais je couru dans le même problème)

dupliquées d'ici: http://groups.google.com/group/touchcode-dev/browse_thread/thread/ada885832019f45b

NSArray *tweetsArray = [resultsDictionary objectForKey:@"results"]; 
for (NSDictionary *tweetDictionary in tweetsArray) { 
    NSString *tweetText = [tweetDictionary objectForKey:@"text"]; 
    [tweets addObject:tweetText]; 
} 

Pour donner plus de contexte, le JSON que je suis l'analyse syntaxique est sous la forme générale
de:

{"results": 
    [ 
    {"text":"tweet1"}, 
    {"text":"tweet2"}, 
    {"text":"tweet3"} 
    ] 
}