Ios 列表的RestKit对象映射
我是RestKit新手,正在尝试映射一个json对象,该对象包含我的模型中的一个对象数组。我已调试并发现响应命中我的服务器-->json is return-->RestKit表示映射成功,并且我已映射了1个对象。。。但是,当我执行Ios 列表的RestKit对象映射,ios,objective-c,json,restkit,restkit-0.20,Ios,Objective C,Json,Restkit,Restkit 0.20,我是RestKit新手,正在尝试映射一个json对象,该对象包含我的模型中的一个对象数组。我已调试并发现响应命中我的服务器-->json is return-->RestKit表示映射成功,并且我已映射了1个对象。。。但是,当我执行BusinessObjectModel*response=result.array.firstObject时,errorCode字段和业务数组(bList)都为空 在OnSuccessBlock中 Json: 要将此Json映射到此目标c对象: 业务对象模型对象映射:
BusinessObjectModel*response=result.array.firstObject时,errorCode字段和业务数组(bList)都为空代码>
在OnSuccessBlock中
Json:
要将此Json映射到此目标c对象:
业务对象模型对象映射:
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[BusinessObjectModel class]];
[responseMapping addAttributeMappingsFromDictionary:@{
@"id": @"business_id",
@"name": @"business_name",
}];
return responseMapping;
b模型:
@interface bModel : NSObject
@property (nonatomic, copy) NSNumber *errorCode;
@property (nonatomic, copy) NSMutableArray *bList;
+(RKObjectMapping *) getMapping;
@end
RKObjectMapping *bMapping = [BusinessObjectModel getMapping];
RKObjectMapping *buslstMapping = [RKObjectMapping mappingForClass:[BModel class]];
[buslstMapping addAttributeMappingsFromDictionary:@{@"errorCode": @"errorCode"}];
// Define the relationship mapping
[buslstMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:nil
toKeyPath:nil
withMapping:bussinessMapping]];
return buslstMapping;
b模型对象映射:
@interface bModel : NSObject
@property (nonatomic, copy) NSNumber *errorCode;
@property (nonatomic, copy) NSMutableArray *bList;
+(RKObjectMapping *) getMapping;
@end
RKObjectMapping *bMapping = [BusinessObjectModel getMapping];
RKObjectMapping *buslstMapping = [RKObjectMapping mappingForClass:[BModel class]];
[buslstMapping addAttributeMappingsFromDictionary:@{@"errorCode": @"errorCode"}];
// Define the relationship mapping
[buslstMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:nil
toKeyPath:nil
withMapping:bussinessMapping]];
return buslstMapping;
描述符如下所示:
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:ResponseMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"bList" statusCodes:nil];
编辑
我想将上述Json映射到:
@interface bModel : NSObject
@property (nonatomic, copy) NSNumber *errorCode;
@property (nonatomic, copy) NSMutableArray *bList;
@end
其中bList是以下对象的数组:
@interface Business : NSObject
@property (nonatomic, copy) NSNumber *id;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSNumber *id;
@property (nonatomic, copy) NSNumber *id;
@end
我想问题是如何处理嵌套关系(对于上述关系,响应描述符必须是什么?很高兴看到您使用RestKit。您的第一个助手将是RestKit提供的日志记录。在AppDelegate中添加这行代码,并观察控制台是否有错误
// The * will send everything RestKit does to the console
// Replace the * with the module you want to check (Network/CoreData/...)
RKLogConfigureByName("RestKit/*", RKLogLevelTrace);
查看JSON时,一方面希望从keyPath“bList”获取对象,另一方面希望在出现错误时获取错误代码或消息。RestKit提供了一个内置的错误处理,以从JSON中获取该信息
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[BusinessObjectModel class]];
[responseMapping addAttributeMappingsFromDictionary:@
{
@"value_from_remote_json": @"value_in_local_object", // e.g. @"id" : @"business_id"
...
}];
return responseMapping;
初始化RKErrorMessage类的RKObjectMapping,并使用正确的键路径(包括状态代码范围)向请求添加RKResponseDescriptor(此处使用客户端错误)。RestKit将自动检测错误代码(在标头中发送时),并应用映射以获取错误消息的内容
// Init error mapping
RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"errorMessage"]];
// Add mapping as response descriptor
RKResponseDescriptor *errorDescriptor =
[RKResponseDescriptor responseDescriptorWithMapping:errorMapping
method:RKRequestMethodGET
pathPattern:nil
keyPath:@"message" // Edit the keyPath to the value of your JSON (e.g. errorCode)
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)];
[RKObjectManager.sharedManager addResponseDescriptor:errorDescriptor];
要在发生故障时获取错误消息,只需获取消息对象。使用块获取对象时,可以使用给定N错误中的userInfo字典
RKErrorMessage *errorMessage = [[error.userInfo objectForKey:RKObjectMapperErrorObjectsKey] firstObject];
NSLog(@"Error: %@", errorMessage);
现在,您可以稍微简化对象模型,并集中精力映射BusinessObjectModel。使用字典映射对象时,需要检查本地属性是否与JSON中的值匹配
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[BusinessObjectModel class]];
[responseMapping addAttributeMappingsFromDictionary:@
{
@"value_from_remote_json": @"value_in_local_object", // e.g. @"id" : @"business_id"
...
}];
return responseMapping;
您不再需要使用RKRelationshipMapping。重新配置对象/映射,然后重试。日志将向您显示提供的映射以及映射操作是否有效。最后一位,通过抛出NSAssert错误,确保映射在内存中
RKObjectMapping *bMapping = [BusinessObjectModel getMapping];
NSAssert(bMapping, @"bMapping mapping must not be nil");
编辑
要将没有键路径的值(如“errorCode”字段)另外映射到对象的映射,需要为对象提供相应的映射。从中选取示例,您将以如下内容结束:
// Init object
@interface RKErrorCode : NSObject
@property (nonatomic) NSNumber *errorCode;
@end
// Init mapping
RKObjectMapping *codeMapping = [RKObjectMapping mappingForClass:[RKErrorCode class]];
[codeMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"errorCode"]];
// Add response descriptor for request
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:codeMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"errorCode" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];
很高兴看到您使用RestKit。您的第一个助手将是RestKit提供的日志记录。在AppDelegate中添加这行代码,并观察控制台是否有错误
// The * will send everything RestKit does to the console
// Replace the * with the module you want to check (Network/CoreData/...)
RKLogConfigureByName("RestKit/*", RKLogLevelTrace);
查看JSON时,一方面希望从keyPath“bList”获取对象,另一方面希望在出现错误时获取错误代码或消息。RestKit提供了一个内置的错误处理,以从JSON中获取该信息
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[BusinessObjectModel class]];
[responseMapping addAttributeMappingsFromDictionary:@
{
@"value_from_remote_json": @"value_in_local_object", // e.g. @"id" : @"business_id"
...
}];
return responseMapping;
初始化RKErrorMessage类的RKObjectMapping,并使用正确的键路径(包括状态代码范围)向请求添加RKResponseDescriptor(此处使用客户端错误)。RestKit将自动检测错误代码(在标头中发送时),并应用映射以获取错误消息的内容
// Init error mapping
RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"errorMessage"]];
// Add mapping as response descriptor
RKResponseDescriptor *errorDescriptor =
[RKResponseDescriptor responseDescriptorWithMapping:errorMapping
method:RKRequestMethodGET
pathPattern:nil
keyPath:@"message" // Edit the keyPath to the value of your JSON (e.g. errorCode)
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)];
[RKObjectManager.sharedManager addResponseDescriptor:errorDescriptor];
要在发生故障时获取错误消息,只需获取消息对象。使用块获取对象时,可以使用给定N错误中的userInfo字典
RKErrorMessage *errorMessage = [[error.userInfo objectForKey:RKObjectMapperErrorObjectsKey] firstObject];
NSLog(@"Error: %@", errorMessage);
现在,您可以稍微简化对象模型,并集中精力映射BusinessObjectModel。使用字典映射对象时,需要检查本地属性是否与JSON中的值匹配
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[BusinessObjectModel class]];
[responseMapping addAttributeMappingsFromDictionary:@
{
@"value_from_remote_json": @"value_in_local_object", // e.g. @"id" : @"business_id"
...
}];
return responseMapping;
您不再需要使用RKRelationshipMapping。重新配置对象/映射,然后重试。日志将向您显示提供的映射以及映射操作是否有效。最后一位,通过抛出NSAssert错误,确保映射在内存中
RKObjectMapping *bMapping = [BusinessObjectModel getMapping];
NSAssert(bMapping, @"bMapping mapping must not be nil");
编辑
要将没有键路径的值(如“errorCode”字段)另外映射到对象的映射,需要为对象提供相应的映射。从中选取示例,您将以如下内容结束:
// Init object
@interface RKErrorCode : NSObject
@property (nonatomic) NSNumber *errorCode;
@end
// Init mapping
RKObjectMapping *codeMapping = [RKObjectMapping mappingForClass:[RKErrorCode class]];
[codeMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"errorCode"]];
// Add response descriptor for request
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:codeMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"errorCode" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];
您的响应描述符不应具有keyPath:@“bList”
,它应设置为nil,因为您不想钻取
它也不应该使用ResponseMapping
,根据映射的结构,它应该使用其他映射
您的映射在这里也是错误的:
@{
@"business_id": @"business_id",
@"business_name": @"business_name",
}];
应该是:
@{
@"id": @"business_id",
@"name": @"business_name",
}];
因为它指定了JSON名称和核心数据名称
若要解决新问题,请将其放回:
[buslstMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"bList" toKeyPath:@"bList"
这是:
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:buslstMapping method:RKRequestMethodAny pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
您的响应描述符不应具有keyPath:@“bList”
,它应设置为nil,因为您不想钻取
它也不应该使用ResponseMapping
,根据映射的结构,它应该使用其他映射
您的映射在这里也是错误的:
@{
@"business_id": @"business_id",
@"business_name": @"business_name",
}];
应该是:
@{
@"id": @"business_id",
@"name": @"business_name",
}];
因为它指定了JSON名称和核心数据名称
若要解决新问题,请将其放回:
[buslstMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"bList" toKeyPath:@"bList"
这是:
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:buslstMapping method:RKRequestMethodAny pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
找到了解决方案,看起来像这样:
RKObjectMapping *bModelMapping = [RKObjectMapping mappingForClass:[business class]];
[bModelMapping addAttributeMappingsFromDictionary:@{
@"id": @"business_id",
@"name": @"business_name",
}];
RKObjectMapping *buslstMapping = [RKObjectMapping mappingForClass:[bModel class]];
[buslstMapping addAttributeMappingsFromDictionary:@{@"errorCode": @"errorCode"}];
// Define the relationship mapping
[buslstMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"bList"
toKeyPath:@"bList" bModelMapping]];
return buslstMapping;
同时更改以下内容:
@property (nonatomic, copy) NSMutableArray *bList;
到
这给了我一个带有错误代码值的bModel
对象和一个bList
,它是一个业务数组,然后可以通过执行以下business*business=[bModel.bList firstObject]将其转换为业务代码>找到了解决方案,它看起来像这样:
RKObjectMapping *bModelMapping = [RKObjectMapping mappingForClass:[business class]];
[bModelMapping addAttributeMappingsFromDictionary:@{
@"id": @"business_id",
@"name": @"business_name",
}];
RKObjectMapping *buslstMapping = [RKObjectMapping mappingForClass:[bModel class]];
[buslstMapping addAttributeMappingsFromDictionary:@{@"errorCode": @"errorCode"}];
// Define the relationship mapping
[buslstMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"bList"
toKeyPath:@"bList" bModelMapping]];
return buslstMapping;
同时更改以下内容:
@property (nonatomic, copy) NSMutableArray *bList;
到
这给了我一个带有错误代码值的bModel
对象和一个bList
,这是一个可以