我的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结果时得到的结果:( (空值), (空值), (空值), (空值), (空值) )
答案 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。