当我使用旧版 API 时,我自己也遇到了同样的问题。以下是我的解决方案:
响应json:
{
"resultCode": 0,
"resultDescription": "OK",
"resultContent": [
{
"region_id": 0,
"description": "USA"
},
{
"region_id": 1,
"description": "Europe"
}
]
}
这个问题有两种解决方案:
解决方案 #1:使用带有 @"" 键路径的对象映射
假设您已经拥有属性名称与 json 键名称相同的托管类 Region
@interface Response
@property (nonatomic) NSInteger resultCode;
@property (nonatomic, strong) NSString resultDescription;
@end
@implementation Response
// Make it KV compliant
@end
映射
// Response map
RKObjectMapping* resMap = [RKObjectMapping mappingForClass: [Response class]];
[resMap addAttributeMappingsFromArray: @[@"resultCode", @"resultDescription"]];
responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:resMap method: RKRequestMethodAny pathPattern:@"" keyPath:@"" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
// Region map
RKEntityMapping* mapping = [RKEntityMapping mappingForEntityForName: name inManagedObjectStore:[[RKObjectManager sharedManager] managedObjectStore]];
[mapping addAttributeMappingsFromArray: @[@"region_id", @"description"]];
descriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping method: RKRequestMethodAny pathPattern:@"/api/regions" keyPath:@"resultContent" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
得到结果
Response* res = [[mappingResult dictionary] objectForKey:[NSNull null]];
NSArray* reg = [[mappingResult dictionary] objectForKey:@"resultContent"];
解决方案 #2:使用序列化
您可以注册您的 RKSerialization 实现
[RKMIMETypeSerialization registerClass:[NKJsonSerialization class]
forMIMEType:RKMIMETypeJSON];
在您的序列化实现中,您可以检查响应是否为错误响应并创建一个NSError 对象,然后将其发送回 Restkit。
@implementation NKJsonSerialization
+ (id)objectFromData:(NSData *)data error:(NSError **)error
{
NSError* serializingError = nil;
NSMutableDictionary* jsonObject = [NSJSONSerialization
JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:&serializingError];
// Process if there is no error
if (!serializingError)
{
NSString* resCodeStr = [jsonObject objectForKey:@"resultCode"];
if ([resCodeStr intValue] != 0) {
{
// Create your NSError for your domain, contain information about response err
serializingError == <#new created error#>
jsonObject = nil;
}else{
[jsonObject removeObjectForKey: @"resultCode"];
[jsonObject removeObjectForKey: @"resultDescription"];
serializingError = nil;
}
}
*error = serializingError;
return jsonObject;
}
如果您的响应包含错误代码,在您的请求回调中,RestKit 将返回一个 NSError 对象,其中底层错误是您刚刚在序列化期间创建的错误。
此解决方案的美妙之处在于您不必关心映射响应状态。错误的响应将(应该)作为 NSError 处理。
如果 json 对象在顶层包含数据对象(键路径 @""),您仍然可以使用映射来获取它而不会发生键冲突,就像在解决方案 #1 中发生的那样。