Serializza e deserializza oggetti Objective-C in JSON

Ho bisogno di serializzare e deserializzare oggetti objective-c in JSON per archiviarli in CouchDB. Le persone hanno codice di esempio per le migliori pratiche per una soluzione generale? Ho esaminato alcuni framework JSON e sono stati interrotti al livello NSDictionary / NSArray. cioè un sacco di framework serializzerà e deserializzerà NSDictionary / NSArray in JSON. Ma devo ancora fare il lavoro per convertire NSDictionary in oggetti Objective-C.

Per rendere le cose più complesse, il mio Oggetto A può fare riferimento a un NSArray / NSDictionary di Object Bs.

La mia domanda è molto simile a questa domanda con l’aggiunta del requisito di raccolta.

Istanziazione di classi personalizzate da NSDictionary

Sembra che tu stia cercando una libreria di serializzazione che ti permetta di convertire oggetti delle tue classi personalizzate in JSON, e poi ricostituirli. La serializzazione dei tipi di liste di proprietà (NSArray, NSNumber, ecc.) Esiste già nelle librerie di terze parti ed è persino integrata in OS X 10.7 e iOS 5.

Quindi, penso che la risposta sia fondamentalmente “no”. Ho fatto questa domanda esatta un mese o due fa sulla mailing list del cocoa-dev, e il più vicino che ho avuto da un hit era di Mike Abdullah, indicando una libreria sperimentale che aveva scritto:

https://github.com/mikeabdullah/KSPropertyListEncoder

Questo archivia gli oggetti negli elenchi di proprietà in memoria, ma come ho già detto ci sono già API per convertirli in JSON.

C’è anche un’app commerciale chiamata Objectify che afferma di essere in grado di fare qualcosa di simile:

http://tigerbears.com/objectify/

È ansible che finirò per implementare ciò che chiedi come parte della mia libreria CouchCocoa, ma non mi sono ancora immerso in questo compito.

https://github.com/couchbaselabs/CouchCocoa

Finalmente possiamo risolvere facilmente questo problema usando JSONModel . Questo è il miglior metodo finora. JSONModel è una libreria che serializza / deserializza genericamente il tuo object in base alla class. Puoi anche usare non-nsobject basato su proprietà come int , short e float . Può anche soddisfare i JSON complessi nidificati.

Considerando questo esempio JSON:

 { "accounting" : [{ "firstName" : "John", "lastName" : "Doe", "age" : 23 }, { "firstName" : "Mary", "lastName" : "Smith", "age" : 32 } ], "sales" : [{ "firstName" : "Sally", "lastName" : "Green", "age" : 27 }, { "firstName" : "Jim", "lastName" : "Galley", "age" : 41 } ]} 

1) Esempio di deserializzazione . nel file di intestazione:

 #import "JSONModel.h" @interface Person : JSONModel @property (nonatomic, strong) NSString *firstName; @property (nonatomic, strong) NSString *lastName; @property (nonatomic, strong) NSNumber *age; @end @protocol Person; @interface Department : JSONModel @property (nonatomic, strong) NSMutableArray *accounting; @property (nonatomic, strong) NSMutableArray *sales; @end 

nel file di implementazione:

 #import "JSONModelLib.h" #import "myJSONClass.h" NSString *responseJSON = /*from example*/; Department *department = [[Department alloc] initWithString:responseJSON error:&err]; if (!err) { for (Person *person in department.accounting) { NSLog(@"%@", person.firstName); NSLog(@"%@", person.lastName); NSLog(@"%@", person.age); } for (Person *person in department.sales) { NSLog(@"%@", person.firstName); NSLog(@"%@", person.lastName); NSLog(@"%@", person.age); } } 

2) Esempio di serializzazione . Nel file di implementazione:

 #import "JSONModelLib.h" #import "myJSONClass.h" Department *department = [[Department alloc] init]; Person *personAcc1 = [[Person alloc] init]; personAcc1.firstName = @"Uee"; personAcc1.lastName = @"Bae"; personAcc1.age = [NSNumber numberWithInt:22]; [department.accounting addOject:personAcc1]; Person *personSales1 = [[Person alloc] init]; personSales1.firstName = @"Sara"; personSales1.lastName = @"Jung"; personSales1.age = [NSNumber numberWithInt:20]; [department.sales addOject:personSales1]; NSLog(@"%@", [department toJSONString]); 

E questo è il risultato NSLog dell’esempio Serialize:

 { "accounting" : [{ "firstName" : "Uee", "lastName" : "Bae", "age" : 22 } ], "sales" : [{ "firstName" : "Sara", "lastName" : "Jung", "age" : 20 } ]} 

Puoi facilmente aggiungere funzionalità JSON alla class NSObject con l’aiuto di NSDictionary, NSArray e NSJSONSerialization

serializzazione:

Basta vedere l’esempio sarà molto facile da capire.

Aggiunta della capacità JSON alla class NSObject: –

 @interface JsonClassEmp : NSObject @property(strong,nonatomic)NSString *EmpName,*EmpCode; -(NSDictionary*)GetJsonDict; @end @implementation JsonClassEmp @synthesize EmpName,EmpCode; //Add all the properties of the class in it. -(NSDictionary*)GetJsonDict { return [NSDictionary dictionaryWithObjectsAndKeys:EmpName,@"EmpName",EmpCode,@"EmpCode", nil]; } @end 

JSON String Generator: –

In iOS 5, Apple ha introdotto NSJSONSerialization, per l’analisi delle stringhe JSON, in modo da utilizzare che genereremo la stringa JSON.

 -(NSString*)GetJSON:(id)object { NSError *writeError = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object options:NSJSONWritingPrettyPrinted error:&writeError]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; return jsonString; } 

Spostarsi verso l’implementazione di Apple è sempre più sicuro da utilizzare poiché si ha la garanzia che verrà mantenuto e aggiornato.

Modo di usare: –

 - (void)viewDidLoad { [super viewDidLoad]; JsonClassEmp *emp1=[[JsonClassEmp alloc]init]; [emp1 setEmpName:@"Name1"]; [emp1 setEmpCode:@"1"]; JsonClassEmp *emp2=[[JsonClassEmp alloc]init]; [emp2 setEmpName:@"Name2"]; [emp2 setEmpCode:@"2"]; //Add the NSDictionaries of the instances in NSArray NSArray *[email protected][emp1.GetJsonDict,emp2.GetJsonDict]; NSLog(@"JSON Output: %@", [self GetJSON:arrEmps_Json]); } 

Riferimento

deserializzazione:

È il solito modo di ottenere i dati deserializzati in NSDictionary o NSArray, quindi assegnarli alle proprietà della class.

Sono sicuro che usando i metodi e le idee usati sopra puoi serializzare e deserializzare facilmente JSON complessi.

Potresti voler provare JTObjectMapping . La loro descrizione:

JTObjectMapping – Ispirato da RestKit. Un framework oggettivo-c molto semplice che mappa una risposta JSON da NSDictionary o NSArray a sottoclassi NSObject per iOS.

È molto piccolo (a differenza di RestKit) e funziona alla grande.

Questo è ansible usando il sistema di mapping degli oggetti della libreria RestKit.

http://restkit.org/

Ho una semplice class del modello, che volevo trasformare in un object JSON.

A questo scopo ho aggiunto un metodo “jsonData” alla mia class modello: il metodo trasforma le proprietà del modello in oggetti di base (numeri int in oggetti NSNumber ecc.) Quindi un dizionario viene popolato con questi oggetti e le chiavi corrispondenti (anche quelle successive) Chiavi JSON). Dopo un controllo (facoltativo) per la validità, l’object dati JSON viene creato con il metodo “dataWithJSONObject” della class NSJSONSerialization e restituito.

 - (NSData *)jsonData { NSDictionary *root = @{@"Sport" : @(_sportID), // I´m using literals here for brevity's sake @"Skill" : @(_skillLevel), @"Visibility" : @(_visibility), @"NotificationRange" : @(_notificationRange)}; if ([NSJSONSerialization isValidJSONObject:root]) { NSData *jsonData = [NSJSONSerialization dataWithJSONObject:root options:0 error:nil]; return jsonData; } return nil; 

}