web-dev-qa-db-fra.com

Convertir un objet iOS Objective C en une chaîne JSON

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);
24
Sankar

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?

37
Damo

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]);
8
X Sham

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;
}
2
Brad Parks

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];
...
0
Burrows Wang