J'ai une classe d'objectif C comme
@interface message : NSObject {
NSString *from;
NSString *date;
NSString *msg;
}
J'ai un NSMutableArray d'instances de cette classe de message. Je souhaite sérialiser toutes les instances de NSMutableArray dans un fichier JSON, à l'aide des nouvelles API JSONSerialization dans iOS 5 SDK. Comment puis-je faire ceci ?
La création d'un NSDictionary de chaque clé est-elle effectuée en effectuant une itération dans chaque instance des éléments de NSArray? Quelqu'un peut-il aider avec le code de la façon de résoudre ce problème? Je ne parviens pas à obtenir de bons résultats dans Google, car "JSON" les oriente vers les appels côté serveur et le transfert de données au lieu de la sérialisation. Merci beaucoup.
MODIFIER:
NSError *writeError = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"JSON Output: %@", jsonString);
EDIT: J'ai fait une application factice qui devrait être un bon exemple pour vous.
Je crée une classe Message à partir de votre extrait de code;
//Message.h
@interface Message : NSObject {
NSString *from_;
NSString *date_;
NSString *msg_;
}
@property (nonatomic, retain) NSString *from;
@property (nonatomic, retain) NSString *date;
@property (nonatomic, retain) NSString *msg;
-(NSDictionary *)dictionary;
@end
//Message.m
#import "Message.h"
@implementation Message
@synthesize from = from_;
@synthesize date = date_;
@synthesize msg = mesg_;
-(void) dealloc {
self.from = nil;
self.date = nil;
self.msg = nil;
[super dealloc];
}
-(NSDictionary *)dictionary {
return [NSDictionary dictionaryWithObjectsAndKeys:self.from,@"from",self.date, @"date",self.msg, @"msg", nil];
}
Ensuite, je configure un tableau NSArray de deux messages dans AppDelegate. L'astuce est que non seulement l'objet de niveau supérieur (les notifications dans votre cas) doit être sérialisable, mais également tous les éléments qu'elle contient: voilà pourquoi j'ai créé la méthode dictionary dans la classe Message.
//AppDelegate.m
...
Message* message1 = [[Message alloc] init];
Message* message2 = [[Message alloc] init];
message1.from = @"a";
message1.date = @"b";
message1.msg = @"c";
message2.from = @"d";
message2.date = @"e";
message2.msg = @"f";
NSArray* notifications = [NSArray arrayWithObjects:message1.dictionary, message2.dictionary, nil];
[message1 release];
[message2 release];
NSError *writeError = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"JSON Output: %@", jsonString);
@end
La sortie lorsque je lance l'application est donc:
2012-05-11 11: 58: 36.018 pile [3146: f803] Sortie JSON: [ { "msg": "c", "de", "date": "b" }, { "msg": "f", "De d", "date": "e" } ]
RÉPONSE ORIGINALE:
Est-ce que ceci la documentation que vous recherchez?
Maintenant, vous pouvez résoudre ce problème facilement en utilisant JSONModel . JSONModel est une bibliothèque qui sérialise/désérialise de manière générique votre objet en fonction de Class. Vous pouvez même utiliser des propriétés non-nsobject comme int
, short
et float
. Il peut également prendre en charge des fichiers JSON imbriqués complexes. Il gère les erreurs pour vous.
Exemple de désérialisation. dans le fichier d'en-tête:
#import "JSONModel.h"
@interface Message : JSONModel
@property (nonatomic, strong) NSString* from;
@property (nonatomic, strong) NSString* date;
@property (nonatomic, strong) NSString* message;
@end
dans le fichier d'implémentation:
#import "JSONModelLib.h"
#import "yourPersonClass.h"
NSString *responseJSON = /*from somewhere*/;
Message *message = [[Message alloc] initWithString:responseJSON error:&err];
if (!err)
{
NSLog(@"%@ %@ %@", message.from, message.date, message.message):
}
Exemple de sérialisation. En fichier d'implémentation:
#import "JSONModelLib.h"
#import "yourPersonClass.h"
Message *message = [[Message alloc] init];
message.from = @"JSON beast";
message.date = @"2012";
message.message = @"This is the best method available so far";
NSLog(@"%@", [person toJSONString]);
Remarque: cela ne fonctionnera qu'avec des objets sérialisables. Cette réponse a été fournie ci-dessus dans une édition de la question elle-même, mais je cherche toujours des réponses dans la section "réponses" moi-même ;-)
- (NSString*) convertObjectToJson:(NSObject*) object
{
NSError *writeError = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object options:NSJSONWritingPrettyPrinted error:&writeError];
NSString *result = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
return result;
}
Voici une bibliothèque que j'ai utilisée dans mes projets BWJSONMatcher , qui peut vous aider à faire facilement correspondre votre chaîne json à votre modèle de données avec pas plus d'une ligne de code.
...
NSString *jsonString = @"{your-json-string}";
YourValueObject *dataModel = [YourValueObject fromJSONString:jsonString];
NSDictionary *jsonObject = @{your-json-object};
YourValueObject *dataModel = [YourValueObject fromJSONObject:jsonObject];
...
YourValueObject *dataModel = instance-of-your-value-object;
NSString *jsonString = [dataModel toJSONString];
NSDictionary *jsonObject = [dataModel toJSONObject];
...