RestKit任意键对象映射

时间:2011-11-17 12:38:18

标签: objective-c mapping restkit object-object-mapping

我的JSON看起来像这样:

 { 
  "key1":[ 
  { 
    "desc":"key1decs.", 
    "duration":50; 
  },{ 
    "desc":"", 
    "duration":90; 
  },{ 
    "desc":"Kurz vor...", 
    "duration":30; 
  } 
 ], 
 "key2":[ 
  { 
    "desc":"key2decs.", 
    "duration":50; 
  },{ 
    "desc":"blabla", 
    "duration":90; 
  } 
] 
} 

我正在尝试进行映射。但我因为不同而陷入困境 未知/任意键。我试过没有KVC的映射,但似乎没有 工作。给我错误: keyPath'key1.desc'的值转换失败。没有策略 从'__NSArrayI'转换为'NSString'。等等 属性。 我在网上看到没有KVC的映射不支持数组 内部结构。 Plz,帮忙。什么是正确的方法?

编辑: 实体:

@interface Sendung : NSObject

 @property (nonatomic, strong) NSString *description;
 @property (nonatomic, strong) NSNumber *duration;
 @property (nonatomic, strong) NSNumber *sendungkey;
@end;

控制器:

 RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Sendung class]];
 mapping.forceCollectionMapping = YES;
[mapping mapKeyOfNestedDictionaryToAttribute:@"sendungkey"];
[mapping mapKeyPath:@"(sendungkey).desc" toAttribute:@"description"];
[mapping mapKeyPath:@"(sendungkey).duration" toAttribute:@"duration"];
[[RKObjectManager sharedManager].mappingProvider addObjectMapping:mapping ];
 mapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[Sendung class] ];
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:url objectMapping:mapping delegate:self];

这是我在NSlogin结果时得到的结果:(     (空值),     (空值),     (空值),     (空值),     (空值) )

1 个答案:

答案 0 :(得分:5)

我相信你错过了映射的一个“级别”。如果仔细查看输入,则会有一个字典(key1),其内容不是单个“Sendung”,而是一个这样的对象数组。因此,您无法将key1的内容直接映射到Sendung ivars,而不是创建新类,例如SendungResult

@interface SendungResult : NSObject
    @property (nonatomic, strong) NSString *keyName;
    @property (nonatomic, strong) NSArray *sendungs;
@end

使用您现在直接使用的关系映射将key1的内容映射到SendungResult sendungs数组。

编辑:我正在扩展答案如下:

正如我之前所说,您正在尝试将对象集合映射到单个实例中,因此这不起作用。相反,您必须创建一个SendungResult,它将为一个键保存一组Sendung个实例。因此,在您的示例中,您将最终得到两个SendungResult个实例(一个将包含三个Sendung s - 嵌套在"key1"下,第二个只有两个,嵌套在{{1 }})。您不能将这种结构映射到一次类,您必须以嵌套JSON的方式嵌套它们。 "key2"类基本不变。

现在进行映射。您需要定义两个映射,一个将根JSON的内容映射到两个Sendung(每个键一个),第二个映射将内部部分映射到单个SendungResult实例。

我们从内部映射开始。

Sendung

这里没有什么真正有趣的,我们只是将关键路径映射到您的属性。现在是外部部分。

RKObjectMapping *sendungMapping = [RKObjectMapping mappingForClass:[Sendung class]];
[sendungMapping mapKeyPath:@"desc" toAttribute:@"desc"];
[sendungMapping mapKeyPath:@"duration" toAttribute:@"duration"];
[[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:sendungMapping];

我们告诉RestKit将keyName keyPath的内容映射到RKObjectMapping *resultMapping = [RKObjectMapping mappingForClass:[SendungResult class]]; [resultMapping setForceCollectionMapping:YES]; [resultMapping mapKeyOfNestedDictionaryToAttribute:@"keyName"]; [resultMapping mapKeyPath:@"(keyName)" toRelationship:@"sendungs" withMapping:sendungMapping]; [[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:resultMapping]; 类的sendungs属性,并使用之前定义的映射。

现在我们可以获取数据

SendungResult

RestKit将创建两个[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"test.js" objectMapping:resultMapping delegate:self]; 个实例,每个数组包含内部SendungResult个类(分别为3个和2个)

注意:我强烈建议您阅读RestKit Object Mapping文档。此外,JSONLint发现您的JSON无效,我不得不删除分号。所以一定要使用有效的json。