2012-05-11 12 views
23

ich eine objektive C-Klasse haben wie,Konvertieren eines iOS Ziel c Objekt in einen JSON-String

@interface message : NSObject { 
NSString *from; 
NSString *date; 
NSString *msg; 
} 

ich eine NSMutableArray von Instanzen dieser Nachrichtenklasse haben. Ich möchte alle Instanzen in dem NSMutableArray in einer JSON-Datei serialisieren, die die neuen JSONSerialization API in iOS 5 SDK verwendet. Wie kann ich das machen ?

Erstellt ein NSDictionary jedes Schlüssels durch Iteration durch jede Instanz der Elemente im NSArray? Kann jemand mit Code helfen, wie man das löst? Ich kann keine guten Ergebnisse in Google erzielen, da "JSON" die Ergebnisse zu serverseitigen Aufrufen und zur Übertragung von Daten statt zur Serialisierung verzerrt. Danke vielmals.

EDIT:

NSError *writeError = nil; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
NSLog(@"JSON Output: %@", jsonString); 

Antwort

35

EDIT: Ich habe einen Dummy-App gemacht, die ein gutes Beispiel für Dich sein sollen.

Ich erstelle eine Message-Klasse aus Ihrem Code-Snippet;

//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]; 
} 

Dann habe ich ein NSArray von zwei Nachrichten in der AppDelegate eingerichtet. Der Trick besteht darin, dass nicht nur das oberste Objekt (Benachrichtigungen in Ihrem Fall) serialisierbar sein muss, sondern auch alle Elemente, die Benachrichtigungen enthalten: Deshalb habe ich das Wörterbuch in der Message-Klasse erstellt.

//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 

Ausgang, wenn ich die Anwendung ausgeführt ist somit:

2012-05-11 11: 58: 36,018 Stapel [3146: F803] JSON Output: [{ "msg": " c " "von": "a", "Datum": "B" }, { "msg": "F", "von": "D" "Datum":" e " } ]

ORIGINAL ANTWORT:

Ist this die Dokumentation, die Sie suchen?

+0

Die OP wird zunächst sein Objekt in ein Wörterbuch konvertieren müssen, aber das ist nach vorne ziemlich gerade (eine statische Methode, den Trick tun wird) – user439407

+1

Damo: diese Seite erklärt nicht über eine Reihe von benutzerdefinierter Klasse zu JSON Konvertierung . Das ist es, was ich zu kämpfen habe. –

+0

Wenn alle Ihre Klassen-Ivars NSString sind, dann sollte es einfach magisch funktionieren ... Vorbehalt: Ich habe das nicht versucht. – Damo

8

Jetzt können Sie dieses Problem mit JSONModel lösen. JSONModel ist eine Bibliothek, die Ihr Objekt basierend auf der Klasse generisch serialisiert/deserialisiert. Sie können sogar non-nsobject für Eigenschaften wie int, short und float verwenden. Es kann auch verschachtelte komplexe JSONs behandeln. Es behandelt die Fehlerprüfung für Sie.

Beispiel für Deserialisierung. in Header-Datei:

#import "JSONModel.h" 

@interface Message : JSONModel 
@property (nonatomic, strong) NSString* from; 
@property (nonatomic, strong) NSString* date; 
@property (nonatomic, strong) NSString* message; 
@end 

in Implementierungsdatei:

#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): 
} 

Serialize Beispiel.In Implementierungsdatei:

#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]); 
+1

Danke! Diese Bibliothek ist so nützlich. – BlackMamba

2

Hinweis: Dies funktioniert nur mit serialisierbaren Objekten. Diese Antwort wurde in einem Bearbeitungs auf die Frage oben angegebene selbst, aber ich suche immer nach Antworten in der „Antworten“ selbst ;-)

- (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; 
} 
+0

Hallo. Wie man ein Array von NSObject konvertiert. Danke dir :) – kemdo

+0

hey @kemdo - nicht sicher - und ich mache keine ios dev mehr, also kann ich nicht wirklich sagen .... Viel Glück! –

0

Hier ist eine Bibliothek i in meinen Projekten verwendet BWJSONMatcher, die helfen kann, Sie können Ihre json-Zeichenfolge problemlos mit Ihrem Datenmodell mit höchstens einer Codezeile verknüpfen.

... 
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]; 
...