我自己在使用傳統API時遇到了同樣的問題。這裏是我的解決方案:
響應JSON:
{
"resultCode": 0,
"resultDescription": "OK",
"resultContent": [
{
"region_id": 0,
"description": "USA"
},
{
"region_id": 1,
"description": "Europe"
}
]
}
有此問題的兩個解決方案:
解決方案1:使用帶有@""
關鍵路徑對象映射
假設你已經有了屬性名稱與json密鑰名稱相同的託管類別區域
@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中發生。
把它們混合起來 - 給出JSON和你的數據對象的細節 – Wain
Hello Wain,看看澄清。 – Ricardo
你的問題的答案是什麼? – jAckOdE