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))
我相信你错过了映射的一个"级别".如果你仔细看看你的输入,你有一个字典(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.
| 归档时间: |
|
| 查看次数: |
3097 次 |
| 最近记录: |