Ios 列表的RestKit对象映射

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对象: 业务对象模型对象映射:

我是RestKit新手,正在尝试映射一个json对象,该对象包含我的模型中的一个对象数组。我已调试并发现响应命中我的服务器-->json is return-->RestKit表示映射成功,并且我已映射了1个对象。。。但是,当我执行
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
,这是一个可以