How to map JSON objects to Objective C classes?
I'm mapping JSON-formatted data from a web server to Objective C classes (NSManagedObjects modeled in Xcode, handled by Core Data). For each attribute of the Objective C class, I need to:
- Determine if the attribute's key exists in the JSON object,
- Determine if the value for t开发者_Go百科hat key is not null, and
- Pass the value to the modeled class instance if conditions 1 and 2 are true
Right now, I'm hard-coding this sequence for each of the attributes, so every attribute needs code like the following:
// dictObject is the JSON object converted into a NSDictionary,
// and person is the instance of the modeled class
if ([dictObject objectForKey:@"nameFirst"] &&
[dictObject objectForKey:@"nameFirst"] != [NSNull null]) {
person.nameFirst = [dictObject objectForKey:@"nameFirst"];
}
Besides requiring a lot of code to handle the various classes, this seems kludgy and brittle: any name change (or language localization) would cause the mapping to fail.
There has to be a better way... what am I missing?
For handling the NULL values, make use of a category on NSDictionary. I use a category that looks like this:
NSDictionary+Utility.h
#import <Foundation/Foundation.h>
@interface NSDictionary (Utility)
- (id)objectForKeyNotNull:(id)key;
@end
NSDictionary+Utility.m
#import "NSDictionary+Utility.h"
@implementation NSDictionary (Utility)
- (id)objectForKeyNotNull:(NSString *)key {
id object = [self objectForKey:key];
if ((NSNull *)object == [NSNull null] || (CFNullRef)object == kCFNull)
return nil;
return object;
}
@end
Retrieve any values from your JSON dictionary like this:
NSString *stringObject = [jsonDictionary objectForKeyNotNull:@"SomeString"];
NSArray *arrayObject = [jsonDictionary objectForKeyNotNull:@"SomeArray"];
There is a framework called RestKit that allows you to do just that. I have not tested it but it appears to be supported by an active company and available as open source: http://restkit.org/
As a lightweight alternative to RestKit, you might try GoldenFleece, which converts between JSON and Objective-C objects using a convention-over-configuration pattern inspired by Jackson.
Disclaimer: I'm the author.
精彩评论