RestKit任意键对象映射

Nig*_*gul 4 mapping objective-c object-object-mapping restkit

我有一个看起来像这样的JSON:

 { 
  "key1":[ 
  { 
    "desc":"key1decs.", 
    "duration":50; 
  },{ 
    "desc":"", 
    "duration":90; 
  },{ 
    "desc":"Kurz vor...", 
    "duration":30; 
  } 
 ], 
 "key2":[ 
  { 
    "desc":"key2decs.", 
    "duration":50; 
  },{ 
    "desc":"blabla", 
    "duration":90; 
  } 
] 
} 
Run Code Online (Sandbox Code Playgroud)

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

编辑:ENtity:

@interface Sendung : NSObject

 @property (nonatomic, strong) NSString *description;
 @property (nonatomic, strong) NSNumber *duration;
 @property (nonatomic, strong) NSNumber *sendungkey;
@end;
Run Code Online (Sandbox Code Playgroud)

控制器:

 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];
Run Code Online (Sandbox Code Playgroud)

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

mja*_*mja 5

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

@interface SendungResult : NSObject
    @property (nonatomic, strong) NSString *keyName;
    @property (nonatomic, strong) NSArray *sendungs;
@end
Run Code Online (Sandbox Code Playgroud)

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

编辑:我将答案扩展如下:

正如我之前所说,您正在尝试将对象集合映射到单个实例中,因此这不起作用.相反,您必须创建一个SendungResult将包含Sendung一个键的实例数组.所以在你的例子中,你最终将得到两个SendungResult实例(一个将持有三个Sendung- 那些嵌套在下面"key1",第二个只有两个,嵌套在下面"key2").您不能将这种结构映射到一次类,您必须以嵌套JSON的方式嵌套它们.该Sendung班是基本不变的.

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

我们从内部映射开始.

RKObjectMapping *sendungMapping = [RKObjectMapping mappingForClass:[Sendung class]];
[sendungMapping mapKeyPath:@"desc" toAttribute:@"desc"];
[sendungMapping mapKeyPath:@"duration" toAttribute:@"duration"];
[[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:sendungMapping];
Run Code Online (Sandbox Code Playgroud)

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

RKObjectMapping *resultMapping = [RKObjectMapping mappingForClass:[SendungResult class]];
[resultMapping setForceCollectionMapping:YES];
[resultMapping mapKeyOfNestedDictionaryToAttribute:@"keyName"];
[resultMapping mapKeyPath:@"(keyName)" toRelationship:@"sendungs" withMapping:sendungMapping];
[[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:resultMapping];
Run Code Online (Sandbox Code Playgroud)

我们告诉RestKit将keyName keyPath的内容映射到具有前面定义的映射的类上的sendungs属性SendungResult.

现在我们可以获取数据

[[RKObjectManager sharedManager]  loadObjectsAtResourcePath:@"test.js" objectMapping:resultMapping delegate:self];
Run Code Online (Sandbox Code Playgroud)

RestKit将创建两个SendungResult实例,每个数组包含内部Sendung类(分别为3和2)

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