Derzeit arbeite ich mit einer API, die sich noch in der Entwicklung befindet. Aufgrund dessen ändern sich die Schlüssel in der Antwort noch. Ich konnte erfolgreich die JSON-Daten aus der API abrufen und analysieren, um sie dann in ein NSDictionary umzuwandeln und diese Werte in benutzerdefinierte Objekte zu mapppen. Der Ansatz, den ich verwende, ist folgender:
-(id)initWithDictionary:(NSDictionary*)dictionary
{
if(self = [super init]){
_ID = [dictionary valueForKey:kKEY_ID];
_name = [dictionary valueForKey:kKEY_NAME];
_nestedObject = [[NestedObject alloc]initWithDictionary:[dictionary valueForKey:kKEY_NESTED_OBJECT]];
//etc...
}
return self
}
Jedes verschachtelte Objekt hat auch die gleiche Analysestruktur.
Dies funktioniert gut, außer wenn sich die API ändert. Wenn etwas geändert wird, fehlen erforderliche Werte und dies führt zu unerwartetem Verhalten oder Abstürzen.
Idealerweise möchte ich, wenn sich einer der Schlüssel ändert, ein NSError erzeugen, mit dem ich den geänderten Wert ausgeben kann, um die Änderung schneller zu finden und zu korrigieren.
Der einzige alternative Ansatz, den ich bisher entwickelt habe, kommt mir unordentlich und schwer wartbar vor.
-(id)initWithDictionary:(NSDictionary*)dictionary andError:(NSError**)error
{
if(self = [super init]){
BOOL _parsedSuccessfully = TRUE;
if (_parsedSuccessfully) {
_ID = [dictionary valueForKey: kKEY_ID];
if (!_ID){
_parsedSuccessfully = FALSE;
*error = [NSError parsingErrorFromKey: kKEY_ID];
}
}
if (_parsedSuccessfully) {
_name = [dictionary valueForKey: kKEY_NAME];
if (!_name){
_parsedSuccessfully = FALSE;
*error = [NSError parsingErrorFromKey: kKEY_NAME];
}
}
if (_parsedSuccessfully) {
_nestedObject = [[NestedObject alloc]initWithDictionary:[dictionary valueForKey:kKEY_NESTED_OBJECT]];
if (!_nestedObject){
_parsedSuccessfully = FALSE;
*error = [NSError parsingErrorFromKey: kKEY_NESTED_OBJECT];
}
}
//etc...
if (!_parsedSuccessfully) {
return nil;
}
}
return self
}
Ich frage mich, ob jemand einen besseren Ansatz kennt, der idealerweise weniger Duplikation verwendet.
Über jede Hilfe würde ich mich sehr freuen.